我将错误信息输入到我的数据库中的ErrorLog表中。我有一个实用程序类来执行此操作:
ErrorHandler.Error("Something has broken!!\n\nDescription");
这很好用。但是,当我尝试访问此表时,换行符似乎不再存在。
如果我SELECT
表:
SELECT * from ErrorLog ORDER BY ErrorDate
日志中没有换行符。这是预期的,因为单行中的换行符会破坏格式。但是,如果我复制数据,则换行符已丢失,数据全部在一行。
当我放入换行符时,如何在查询结束时获取数据换行符?我不知道字符串在进入表时是否已被删除换行符,或者SQL Server Management Studio中的查看器是否已删除换行符。
将错误消息放入的列的数据类型为nvarchar(Max)
,如果这会产生影响。
以下是字符串传入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 :(得分:26)
无需替换字符串输入\输出,只需选择正确的选项:
Tools -> Options...
> Query Results
> SQL Server
> Results to Grid
set "Retain CR\LF on copy or save" to true.
别忘了重新启动管理工作室!
答案 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中的“文本结果”按钮。它不是很干净,但是可以让您以大约半秒的工作时间查看换行符。