如何在SQL Server VARCHAR/NVARCHAR字符串中插入换行符

Mar*_*ski 530 sql sql-server line-breaks

我没有看到关于这个主题的任何类似的问题,我不得不研究这个我现在正在做的事情.以为我会发布答案,以防其他人有同样的问题.

Sör*_*lau 570

char(13)CR.对于DOS-/Windows风格的CRLF换行符,您需要char(13)+char(10),如:

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
Run Code Online (Sandbox Code Playgroud)

  • char(13)+ char(10)在Windows中不适合我.我刚用char(10) (27认同)
  • 谢谢microsoft让一切变得如此简单.你让我们使用`\ r \n`怎么样? (18认同)
  • @HBlackorby\r和\n在数十年之前将Java用于C语言; 并且是Python,PHP,Ruby,C++,C#等的标准... (9认同)
  • @Nima:某些应用程序将使用其中一个或两者来显示一个新行,但是您输出此文本的许多应用程序都需要连续出现以表示新行.我发现使用它们都是安全的.您可以在此列出您不适用的应用程序.我自己更喜欢CHAR(0x0D)+ CHAR(0x0A)十六进制值,但每个都更喜欢它们. (6认同)
  • 提供\ r \n将意味着确认存在正则表达式,并且有用户能够理解和使用它们. (5认同)
  • 我成功地使用了这个方法,但遇到了一个问题:一旦你有超过480` +`,SQL Server就会开始抱怨你的查询嵌套得太深了.我的解决方案是使用Rob Cooper的答案,而是使用更长,更模糊的令牌. (2认同)

Mar*_*ski 268

我在这里找到了答案: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
Run Code Online (Sandbox Code Playgroud)

这打印出以下内容:

这是第1行.
这是第2行.

  • 看来你需要使用PRINT @text而不是SELECT来获得这个结果. (11认同)
  • 更新:忘掉它.它插入就好了.管理工作室是用可视空间替换制表符和换行符的管理工作室 (9认同)
  • @DonCheadle 所说的,您可能必须关闭查询选项卡并重新打开它才能使该设置生效。;) (6认同)
  • 要测试您的输出,如果使用SSMS,请确保选中了“在复制或保存时保留CR / LF”选项,否则所有粘贴的结果都会使换行无效。您可以在设置,查询结果,SQL Server,结果到网格中找到它。 (4认同)
  • BTW:你也可以使用`NCHAR(0x1234)`来获得一个unicode字符.插入换行符不是必需的,但如果必须插入/搜索unicode字符,则可以派上用场. (3认同)
  • 在SQL Server 2016中,仅当我使用`print`而不是`select`时,我才看到它打印两行,例如:`DECLARE @text NVARCHAR(100);。SET @text ='这是第1行。' + CHAR(13)+'这是第2行。'; 打印@text;` (2认同)

Fra*_*k V 80

另一种方法是这样的:

INSERT CRLF SELECT 'fox 
jumped'
Run Code Online (Sandbox Code Playgroud)

也就是说,只需在编写查询时在查询中插入换行符,就会向数据库添加类似的中断.这适用于SQL Server Management Studio和Query Analyzer.我相信如果你在字符串上使用@符号,这也适用于C#.

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,SQL语言的语法只允许字符串文字中的原始换行符.它在我尝试的所有引擎中都以这种方式工作(SQL Server,Oracle,MySQL,PostgreSQL和SQLite). (14认同)
  • 这显然是对我来说最好的答案. (5认同)

AjV*_*Jsy 21

在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))
Run Code Online (Sandbox Code Playgroud)

结果:
第1
行第2
行第3行

空白行有多长时间了?
2

什么是ASCII值?
13
10

或者,如果你想在一行(几乎!)上指定你的字符串,你可以REPLACE()这样使用(可选择CHAR(13)+CHAR(10)用作替换):

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')
Run Code Online (Sandbox Code Playgroud)


Tru*_*ubs 21

所有这些选项都适用于您的情况,但如果您使用 SSMS您可能看不到它们中的任何一个 (如某些评论中提到的 SSMS 隐藏 CR/LF)

因此,与其驾驶自己绕过弯道,不如检查此设置

Tools | Options

这将取代

  • 我使用的是 SSMS v18.2,但很难保持此设置。我必须检查它,然后退出 SSMS 并重新启动。并确保您只有 1 个 SSMS 实例正在运行。第二个实例将覆盖原始值的设置。但最终我成功了。+1 (4认同)
  • 另请注意,如果输出到文本而不是网格,则 CR/LF 将按预期保留,而无需对应用程序选项进行任何更改。 (3认同)

Rob*_*per 15

关注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))
Run Code Online (Sandbox Code Playgroud)

看起来可以通过用CHAR替换占位符来完成(13)

好问题,从来没有自己做过:)

  • 但如果文本中有电子邮件地址?"jon@bob.com"成为"jon bob.com"(在电子礼服中换行) (4认同)
  • @ChrisNash然后使用不同的占位符(例如"|","〜"或多个字符,"!#!").请参阅以下答案:http://stackoverflow.com/a/31179/179311. (4认同)

小智 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
Run Code Online (Sandbox Code Playgroud)


Ken*_*Kin 7

我会说

concat('This is line 1.', 0xd0a, 'This is line 2.')
Run Code Online (Sandbox Code Playgroud)

或者

concat(N'This is line 1.', 0xd000a, N'This is line 2.')
Run Code Online (Sandbox Code Playgroud)

  • 另请检查 @Trubs 答案上的 SSMS 配置:/sf/answers/4143291701/ (2认同)

小智 5

这是一个 C# 函数,它在现有文本 blob 前面添加一个文本行,由 CRLF 分隔,并返回一个适用于INSERTUPDATE操作的 T-SQL 表达式。它有一些我们专有的错误处理,但是一旦你把它撕掉,它可能会有所帮助——我希望如此。

/// <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("");
    }
}
Run Code Online (Sandbox Code Playgroud)