如何在 SQL Server VARCHAR/NVARCHAR 字符串中插入换行符
Posted
技术标签:
【中文标题】如何在 SQL Server VARCHAR/NVARCHAR 字符串中插入换行符【英文标题】:How to insert a line break in a SQL Server VARCHAR/NVARCHAR string 【发布时间】:2010-09-07 01:26:39 【问题描述】:我没有看到关于这个主题的任何类似问题,我不得不研究一下我现在正在做的事情。以为我会发布答案,以防其他人有同样的问题。
【问题讨论】:
要测试您的输出,如果使用 SSMS,请确保选中 Retain CR/LF on copy or save 选项,否则所有粘贴的结果都会丢失换行符。您可以在设置、查询结果、sql server、结果到网格中找到它。 @StefanosZilellis 并确保打开一个新的查询窗口以使设置更改生效。 【参考方案1】:我在这里找到了答案:http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-code/
您只需连接字符串并在需要换行符的位置插入CHAR(13)
。
例子:
DECLARE @text NVARCHAR(100)
SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'
SELECT @text
这会打印出以下内容:
这是第 1 行。 这是第 2 行。
【讨论】:
更新:算了。它插入就好了。这是管理工作室,它用可见性空格替换制表符和换行符 看来你需要使用 PRINT @text 而不是 SELECT 来获得这个结果。 顺便说一句:您也可以使用NCHAR(0x1234)
来获取 unicode 字符。插入换行符不是必需的,但如果必须插入/搜索 unicode 字符,则可以派上用场。
在 SQL Server 2016 中,如果我使用 print
而不是 select
,我只会看到它打印两行,例如:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
要测试您的输出,如果使用 SSMS,请确保选中 Retain CR/LF on copy or save 选项,否则所有粘贴的结果都会丢失换行符。您可以在设置、查询结果、sql server、结果到网格中找到它。【参考方案2】:
关注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)
替换占位符来完成好问题,我自己从来没有做过:)
【讨论】:
但是如果文本中有一个电子邮件地址呢? “jon@bob.com”变成“jon bob.com”(在电子礼服中有一个换行符) @ChrisNash 然后使用不同的占位符(例如“|”、“~”或多个字符“!#!”)。请参阅下面的答案:***.com/a/31179/179311. "CONCAT (CHAR(13) , CHAR(10))" ("\r\n") 对于windows环境会更好,我假设是这种情况(SQL Server)cs.toronto.edu/~krueger/csc209h/tut/line-endings.html 这是不确定的。表被定义为无序记录集。不能保证数据库引擎会按照插入的顺序返回记录。如果没有第二列以某种方式保留顺序(简单的IDENTITY()
可以工作)和输出查询中的ORDER BY
,服务器将以它认为方便的任何顺序返回记录。这可能与它们插入的顺序相同,但服务器可以在没有ORDER BY
的情况下随意执行此操作。【参考方案3】:
char(13)
是 CR
。对于 DOS-/Windows 样式的 CRLF
换行符,您需要 char(13)+char(10)
,例如:
'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
【讨论】:
char(13)+char(10) 在 Windows 中对我不起作用。我刚刚使用了 char(10) @Nima:一些应用程序会使用一个或另一个或两者来显示新行,但是您可能输出此文本的许多应用程序将要求两者都连续出现以表示新行。我觉得两者都用是安全的。您可以在此处列出它不适用于哪些应用程序。我自己更喜欢 CHAR(0x0D) + CHAR(0x0A) 十六进制值,但更喜欢它们自己的值。 我成功地使用了这个方法,但是遇到了一个问题:一旦你有超过480个+
,SQL Server就会开始抱怨你的查询嵌套太深。我的解决方案是改用 Rob Cooper 的答案,但要使用更长且更晦涩的标记。
提供 \r\n 意味着承认正则表达式存在并且有用户能够理解和使用它们。
@HBlackorby \r 和 \n 在 C 语言中的使用比 Java-anything 早了几十年;并且在 Python、php、Ruby、C++、C# 等中都是标准的......【参考方案4】:
这总是很酷,因为当您从 Oracle 等导出列表时,您会得到跨越多行的记录,而这反过来又可能对 cvs 文件等感兴趣,所以要小心。
无论如何,Rob 的回答很好,但我建议使用 @ 以外的其他内容,多尝试一些,例如 §§@@§§ 或其他内容,这样它就有机会获得一些独特性。 (但是,请记住您要插入的 varchar
/nvarchar
字段的长度......)
【讨论】:
【参考方案5】:另一种方法是:
INSERT CRLF SELECT 'fox
jumped'
也就是说,在编写查询时只需在查询中插入一个换行符,就会将类似的换行符添加到数据库中。这适用于 SQL 服务器管理工作室和查询分析器。如果您在字符串上使用 @ 符号,我相信这也适用于 C#。
string str = @"INSERT CRLF SELECT 'fox
jumped'"
【讨论】:
换句话说,SQL 语言的语法只允许字符串文字中的原始换行符。它在我尝试过的所有引擎(SQL Server、Oracle、mysql、PostgreSQL 和 SQLite)中都以这种方式工作。 如果你在存储过程中使用它有时会随机退出工作 这是一个简单而优雅的解决方案。【参考方案6】:这是一个 C# 函数,它将文本行添加到现有文本 blob 前,由 CRLF 分隔,并返回适用于 INSERT
或 UPDATE
操作的 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("");
【讨论】:
【参考方案7】:我来到这里是因为我担心我在 C# 字符串中指定的 cr-lfs 没有显示在 SQl Server Management Studio 查询响应中。
事实证明,它们在那里,但没有显示出来。
要“查看” cr-lfs,请使用以下 print 语句:
declare @tmp varchar(500)
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp
【讨论】:
【参考方案8】:在 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
或者,如果您希望在一行上指定字符串(几乎!),您可以像这样使用REPLACE()
(可选地使用CHAR(13)+CHAR(10)
作为替换):
PRINT REPLACE('Line 1`Line 2`Line 3','`','
')
【讨论】:
【参考方案9】:我会说
concat('This is line 1.', 0xd0a, 'This is line 2.')
或
concat(N'This is line 1.', 0xd000a, N'This is line 2.')
【讨论】:
还要检查@Trubs 上的SSMS 配置答案:***.com/a/59189881/386619 @JayCummins :o .. ?【参考方案10】:所有这些选项都取决于您的情况,但如果您使用 SSMS,您可能看不到其中任何一个工作(如某些 cmets SSMS 隐藏 CR/LF 中所述)
因此,与其开车绕弯,不如在
中检查此设置Tools
|
Options
【讨论】:
我使用的是 SSMS 的 v18.2,但无法坚持使用此设置。我必须检查它,然后退出 SSMS 并重新启动。并确保您只运行 1 个 SSMS 实例。第二个实例将用原始值覆盖设置。但最终我成功了。 +1 另请注意,如果您输出到文本而不是网格,则 CR/LF 将按预期保留,而无需对应用程序选项进行任何更改。【参考方案11】:在某些特殊情况下,您可能会发现这很有用(例如,在 MS Report 中呈现单元格内容) 示例:
select * from
(
values
('use STAGING'),
('go'),
('EXEC sp_MSforeachtable
@command1=''select ''''?'''' as tablename,count(1) as anzahl from ? having count(1) = 0''')
) as t([Copy_and_execute_this_statement])
go
【讨论】:
你能再解释一下吗,我不知道它是如何工作的或如何使用它 此语句提供的不是包含 CR\LF 的字符串,而是包含一列(名为 [Copy_and_execute_this_statement] )和三行的小表。这可能适合消费者,他们吞下 CR\LF 但可以消费表格(例如 MS Report )另一个简单的例子是“ select * from ( values ( 'Adam'),('Eva')) as t([some_name] )"以上是关于如何在 SQL Server VARCHAR/NVARCHAR 字符串中插入换行符的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server Management Studio 中注册 SQL Server 服务器?
如何在 AG Listener SQL Server 中添加数据库,并在主 SQL Server 和辅助 SQL Server 上创建?