SQL ServerのVARCHAR / NVARCHAR文字列に改行を挿入する方法


562

このトピックに関して同様の質問が表示されることはなかったので、現在取り組んでいることについてこれを調査する必要がありました。他の誰かが同じ質問をした場合に備えて、私はその答えを投稿すると思いました。


8
出力をテストするには、SSMSを使用している場合は、[コピーまたは保存時にCR / LFを保持する]オプションがオンになっていることを確認してください。チェックされていない場合、貼り付けたすべての結果で改行が失われます。これは、設定、クエリ結果、SQLサーバー、グリッドへの結果で見つかります。
Stefanos Zilellis、2018年

1
@StefanosZilellisをクリックし、設定の変更を有効にするために新しいクエリウィンドウを開いてください。
ドン・チードル

回答:


597

char(13)ですCR。DOS // WindowsスタイルのCRLF改行の場合char(13)+char(10)、次のようにします。

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'

28
char(13)+ char(10)は、Windowsでは機能しませんでした。char(10)を使用したところです
nima

6
@Nima:一部のアプリケーションはどちらか一方または両方を使用して新しい行を表示しますが、このテキストを出力する多くのアプリケーションでは、新しい行を示すために両方を連続して表示する必要があります。両方を使用しても安全です。動作しないアプリをここにリストできます。私自身はCHAR(0x0D)+ CHAR(0x0A)16進値を好みますが、それぞれ独自の値を使います。
MikeTeeVee 2013年

2
この方法を使用しましたが、問題が発生しました。約480を超えると+、SQL Serverはクエリのネストが深すぎると不平を言い始めます。私の解決策は、代わりにRob Cooperの答えを使用することでしたが、はるかに長く、あいまいなトークンを使用していました。
Marcus Downing、

5
\ r \ nを提供することは、正規表現が存在し、それらを理解して使用できるユーザーがいることを認めることを意味します。
wwmbes

10
@HBlackorby \ rと\ nは、Javaで何十年も前にCで使用されたものです。Python、PHP、Ruby、C ++、C#などで
標準

286

私はここで答えを見つけました:http : //blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-コード/

文字列を連結し、CHAR(13)改行したい場所に挿入するだけです。

例:

DECLARE @text NVARCHAR(100)
SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'
SELECT @text

これにより、以下が出力されます。

これは1行目です。
これは2行目です。


11
更新:忘れてください。それはうまく挿入します。それの管理のスタジオの可視性のためのスペースとタブ、改行を置き換える1
ダニエルDolz

12
この結果を得るには、SELECTではなくPRINT @textを使用する必要があるようです。
QMasterは2014年

3
ところで:あなたはまたNCHAR(0x1234)、Unicode文字を取得するために使用することができます。改行を挿入する必要はありませんが、Unicode文字を挿入/検索する必要がある場合に便利です。
Paul Groke、2014年

3
SQL Server 2016では、のprint代わりにを使用した場合にのみ2行が出力されることがselectDECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
わかり

7
出力をテストするには、SSMSを使用している場合は、[コピーまたは保存時にCR / LFを保持する]オプションがオンになっていることを確認してください。チェックされていない場合、貼り付けたすべての結果で改行が失われます。これは、設定、クエリ結果、SQLサーバー、グリッドへの結果で見つかります。
ドン・チードル

81

これを行う別の方法は次のとおりです。

INSERT CRLF SELECT 'fox 
jumped'

つまり、クエリの作成中に改行を挿入するだけで、データベースに同様の改行が追加されます。これは、SQL Server Management StudioおよびQuery Analyzerで機能します。文字列に@記号を使用すると、これはC#でも機能すると思います。

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"

14
言い換えると、SQL言語の構文では、文字列リテラルの生の改行が許可されます。私が試したすべてのエンジン(SQL Server、Oracle、MySQL、PostgreSQL、SQLite)でこのように動作します。
アルバロゴンサレス

ストアドプロシージャで使用すると、ランダムに機能しなくなることがある
DaFi4

25

これをSSMSで実行すると、SQL自体の改行が行にまたがる文字列値の一部になる方法が示されます。

PRINT 'Line 1
Line 2
Line 3'
PRINT ''

PRINT 'How long is a blank line feed?'
PRINT LEN('
')
PRINT ''

PRINT 'What are the ASCII values?'
PRINT ASCII(SUBSTRING('
',1,1))
PRINT ASCII(SUBSTRING('
',2,1))

結果:
1
行目2
行目3行目

空行はどれくらいの長さですか?
2

ASCII値とは何ですか?
13
10

または、文字列を1行で指定する場合(ほぼ!)、次のように使用できますREPLACE()(オプションでCHAR(13)+CHAR(10)置換として使用します)。

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')

16

Googleをフォローしています ...

ウェブサイトからコードを取得する:

CREATE TABLE CRLF
    (
        col1 VARCHAR(1000)
    )

INSERT CRLF SELECT 'The quick brown@'
INSERT CRLF SELECT 'fox @jumped'
INSERT CRLF SELECT '@over the '
INSERT CRLF SELECT 'log@'

SELECT col1 FROM CRLF

Returns:

col1
-----------------
The quick brown@
fox @jumped
@over the
log@

(4 row(s) affected)


UPDATE CRLF
SET col1 = REPLACE(col1, '@', CHAR(13))

プレースホルダーをCHAR(13)に置き換えることで実行できるように見えます

良い質問です、自分でやったことはありません:)


4
しかし、テキストにメールアドレスが含まれている場合はどうでしょうか?"jon@bob.com"は "jon bob.com"になります(e-dressに改行が入ります)
intrepidis

4
次に@ChrisNashは別のプレースホルダーを使用します(例: "|"、 "〜"、または複数の文字 "!#!")。以下の回答をご覧ください:stackoverflow.com/a/31179/179311
bradlis7 2015年

1
"CONCAT(CHAR(13)、CHAR(10))"( "\ r \ n")はWindows環境に適しています。これは私がそうだと思います(SQL Server)cs.toronto.edu/~krueger/csc209h/ tut / line-endings.html
d.popov

12

C#文字列で指定したcr-lfsがSQl Server Management Studioクエリ応答に表示されないのではないかと心配して、ここに来ました。

判明しましたが、表示されていません。

cr-lfsを「見る」には、次のようなprintステートメントを使用します。

declare @tmp varchar(500)    
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp

4

CRLFで区切られた既存のテキストBLOBの前にテキスト行を付加し、INSERTまたはUPDATE操作に適したT-SQL式を返すC#関数を次に示します。独自のエラー処理がいくつか含まれていますが、一度それを取り除いたら、役立つかもしれません。

/// <summary>
/// Generate a SQL string value expression suitable for INSERT/UPDATE operations that prepends
/// the specified line to an existing block of text, assumed to have \r\n delimiters, and
/// truncate at a maximum length.
/// </summary>
/// <param name="sNewLine">Single text line to be prepended to existing text</param>
/// <param name="sOrigLines">Current text value; assumed to be CRLF-delimited</param>
/// <param name="iMaxLen">Integer field length</param>
/// <returns>String: SQL string expression suitable for INSERT/UPDATE operations.  Empty on error.</returns>
private string PrependCommentLine(string sNewLine, String sOrigLines, int iMaxLen)
{
    String fn = MethodBase.GetCurrentMethod().Name;

    try
    {
        String [] line_array = sOrigLines.Split("\r\n".ToCharArray());
        List<string> orig_lines = new List<string>();
        foreach(String orig_line in line_array) 
        { 
            if (!String.IsNullOrEmpty(orig_line))  
            {  
                orig_lines.Add(orig_line);    
            }
        } // end foreach(original line)

        String final_comments = "'" + sNewLine + "' + CHAR(13) + CHAR(10) ";
        int cum_length = sNewLine.Length + 2;
        foreach(String orig_line in orig_lines)
        {
            String curline = orig_line;
            if (cum_length >= iMaxLen) break;                // stop appending if we're already over
            if ((cum_length+orig_line.Length+2)>=iMaxLen)    // If this one will push us over, truncate and warn:
            {
                Util.HandleAppErr(this, fn, "Truncating comments: " + orig_line);
                curline = orig_line.Substring(0, iMaxLen - (cum_length + 3));
            }
            final_comments += " + '" + curline + "' + CHAR(13) + CHAR(10) \r\n";
            cum_length += orig_line.Length + 2;
        } // end foreach(second pass on original lines)

        return(final_comments);


    } // end main try()
    catch(Exception exc)
    {
        Util.HandleExc(this,fn,exc);
        return("");
    }
}

4

私は言います

concat('This is line 1.', 0xd0a, 'This is line 2.')

または

concat(N'This is line 1.', 0xd000a, N'This is line 2.')

3

たとえばOracleからエクスポートされたリストを取得すると、複数行にまたがるレコードが取得されるため、これは、たとえばcvsファイルにとって興味深いものになる可能性があるため、注意してください。

とにかく、ロブの答えは良いですが、@以外の何かを使用することをお勧めします。§§@@§§などのいくつかを試してみて、一意性が得られるようにします。(ただし、挿入するvarchar/ nvarcharフィールドの長さを覚えておいてください。)


3

これらのオプションはすべて状況に応じて機能しますが、SSMSを使用している場合は機能しない場合があります (一部のコメントで説明されているように、SSMSはCR / LFを非表示にします)。

曲がりくねった道を走るのではなく、

Tools | Options

置き換えられます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.