2011-12-05 194 views
10

我在我的数据库的错误日志表中输入错误信息。我有一个工具类来做到这一点:在sql server中丢失换行符

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: 

换行符应该是双倍间隔的地方。

任何想法?

+0

当你说换行符丢失,是因为当您从SSMS查询并不会出现在网格结果有何看法?我相信,即使在复制和粘贴时,SSMS也会在结果中划分换行符。您可以通过将其转换为varbinary并查看相关字符代码是否存在于二进制表示中,或者通过编写一个小型c#应用程序来验证。 –

回答

15

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

实施例:

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; 
+0

太棒了!这工作。这样做仅仅是为了获取数据,这有点不方便。 – Oliver

1

尝试使用char(13) + char(10),而不是在你的字符串“\ n”(定义常量并连接到您的SQL)

+0

如果我在'ErrorHandler.Error'方法中做了'message.replace('\ n',char(13)+ char(10))'',它会在所有情况下工作吗? – Oliver

+0

我会说给它一个旋风;-)但在理论上......是的...... – penderi

+0

数据正在进入表格。问题在于SSMS显示和处理数据的方式。 –

4

更新。

如上所述here,一个解决方案以保持在SSMS查看换行是将输出转换为XML:

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

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

+1

您应该使用“TYPE”关键字。看到我的答案:http://stackoverflow.com/a/30927549/2266979 –

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年

9

无需更换字符串输入\输出,你只需要拿起正确的选项:

Tools -> Options... 

> Query Results 
    > SQL Server 
    > Results to Grid 

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

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

根据Charles Gagnon answer

+0

谢谢。好解决方案! – user2523651

+1

我必须在更改此设置后重新启动SSMS,然后才能正常工作。我认为这比直接接受的答案更直接地解决了这个问题。 – funkwurm

+0

这个答案需要更多的投票。附:您只需创建新的查询窗口;更改选项后不必重新启动。 – mcNux