在SQL Server中丢失换行符

时间:2011-12-05 15:53:03

标签: sql-server

我将错误信息输入到我的数据库中的ErrorLog表中。我有一个实用程序类来执行此操作:

ErrorHandler.Error("Something has broken!!\n\nDescription");

这很好用。但是,当我尝试访问此表时,换行符似乎不再存在。

如果我SELECT表:

SELECT * from ErrorLog ORDER BY ErrorDate

日志中没有换行符。这是预期的,因为单行中的换行符会破坏格式。但是,如果我复制数据,则换行符已丢失,数据全部在一行。

当我放入换行符时,如何在查询结束时获取数据换行符?我不知道字符串在进入表时是否已被删除换行符,或者SQL Server Management Studio中的查看器是否已删除换行符。

将错误消息放入的列的数据类型为nvarchar(Max),如果这会产生影响。

编辑:出乎意料的是,Pendri的解决方案无效。

以下是字符串传入SQL服务器之前的摘录:

POST /ipn/paymentResponse.ashx?installation=272&msgType=result HTTP/1.0\n\rContent-Length: 833\n\rContent-Type: 

当我从SQL Server Management Studio中的网格查看器中提取它时,这是相同的字符串:

POST /ipn/paymentResponse.ashx?installation=272&msgType=result HTTP/1.0  Content-Length: 833  Content-Type:

换行符的位置是双倍的。

有什么想法吗?

7 个答案:

答案 0 :(得分:26)

无需替换字符串输入\输出,只需选择正确的选项:

Tools -> Options...

> Query Results 
  > SQL Server 
    > Results to Grid 

set "Retain CR\LF on copy or save" to true.

别忘了重新启动管理工作室!

根据Charles Gagnon answer

答案 1 :(得分:18)

SSMS使用网格输出中的空格替换换行符。如果使用“打印”来打印值(将转到“消息”选项卡),则如果它们与数据一起存储,则将在那里显示回车符。

示例:

SELECT 'ABC' + CHAR(13) + CHAR(10) + 'DEF'
PRINT 'ABC' + CHAR(13) + CHAR(10) + 'DEF'

第一个将显示在网格中的单个单元格中而没有中断,第二个将打印到消息窗格中。

打印值的快捷方法是选择变量:

DECLARE @x varchar(100);
SELECT @x = 'ABC' + CHAR(13) + CHAR(10) + 'DEF';
PRINT @x;

答案 2 :(得分:4)

几年后更新。

正如here所述,在SSMS中保留查看换行符的一种解决方案是将输出转换为XML:

SELECT * FROM (
  SELECT * from ErrorLog ORDER BY ErrorDate
) AS [T(x)] FOR XML PATH

幸运的是,如果你有SSMS 2012,这不再是一个问题,因为会保留换行符。

答案 3 :(得分:1)

尝试在字符串中使用char(13) + char(10)而不是'\ n'(定义一个常量并连接到您的sql)

答案 4 :(得分:1)

我回显David C's answer,除非你应该使用“TYPE”关键字,这样你就可以点击在新窗口中打开数据。

请注意,任何不安全的XML字符都无法与我们的任何解决方案一起使用。

以下是概念证明:

DECLARE @ErrorLog TABLE (ErrorText varchar(500), ErrorDate datetime);
INSERT INTO @ErrorLog (ErrorText, ErrorDate) VALUES
    ('This is a long string with a' + CHAR(13) + CHAR(10) + 'line break.', getdate()-1),
    ('Another long string with' + CHAR(13) + CHAR(10) + '<another!> line break.', getdate()-2);
SELECT
    (
        SELECT  ErrorText AS '*'
        FOR XML PATH(''), TYPE
    ) AS 'ErrorText',
    ErrorDate
FROM        @ErrorLog
ORDER BY    ErrorDate;

我可以确认在SSMS 2012中复制出网格时会保留换行符。

答案 5 :(得分:0)

对于SQL Server 2008,没有规定将“在复制或保存时保留CR \ LF”设置为true。

对于这个问题,我所做的就是,将char(13)替换为“ \ r”,并将char(10)替换为“ \ n”,如下所示。

REPLACE(REPlACE([COLUMN_NAME],char(13), '\r'),CHAR(10),'\n')

在后面的代码中,我再次用break标记替换了“ \ r \ n”。

我以这种方式解决了问题,因为如上所述,SQL 2008中没有提供任何选项。不过,这个答案可能是另一种选择。

谢谢

答案 6 :(得分:0)

另一个简单的解决方案是单击SSMS中的“文本结果”按钮。它不是很干净,但是可以让您以大约半秒的工作时间查看换行符。