2011-12-05 150 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