2011-12-05 18 views
10

データベースのErrorLogテーブルにエラー情報を入力しています。私はこれを行うためのユーティリティクラスを持っています:SQL Serverで改行が失われる

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

これはうまくいきます。しかし、このテーブルにアクセスしようとすると、改行はもはや存在しないように見えます。

私はテーブルSELECT場合:

SELECT * from ErrorLog ORDER BY ErrorDate 

をログに存在するいかなる改行はありません。これは、一行の行の改行が書式設定を壊すため、予想されています。ただし、データをコピーすると、改行文字が失われ、データはすべて1行になります。

改行を挿入すると、クエリの最後にデータに改行を入れるにはどうすればよいですか? SQL Server Management Studioのビューアが改行を取り除いた場合、文字列が改行を取り除かれたかどうかわかりません。

エラーメッセージが挿入される列のデータ型は、違いがある場合はnvarchar(Max)です。

EDIT:予期せず、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(定数を定義し、あなたのSQLに連結)の代わりに、あなたの文字列に「\ n」ののchar(13) + char(10)を使用してみてください、グリッド出力のスペースを改行に置き換えられます。印刷を使用して値を印刷すると(メッセージタブに移動します)、データが保存されている場合は、キャリッジリターンがそこに表示されます。

例:

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

+0

私の 'ErrorHandler.Error'メソッドで' message.replace( '\ n'、char(13)+ char(10)) 'のようなことをした場合、すべての場合に動作しますか? – Oliver

+0

私はそれを渦巻きにすると言いたいと思いますが、理論的には...はい... – penderi

+0

データがテーブルに入っています。問題は、SSMSがデータを表示して処理する方法です。 –

4

は、数年後に更新します。

としてはhere説明し、SSMSで閲覧改行を維持する一つの解決策は、XMLへの出力を変換することです:あなたはSSMS 2012を持っている場合、

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

幸いな改行があるように、これは、もはや問題ではありません保持される。

+1

"TYPE"キーワードを使用してください。私の答えを参照してください:http://stackoverflow.com/a/30927549/2266979 –

1

私はDavid C's answerをエコーし​​ます。ただし、新しいウィンドウでデータを開くために「TYPE」キーワードを使用する必要があります。

安全でないXML文字は、いずれのソリューションでもうまく動作しないことに注意してください。

はここ概念の証明である:SSMSで、グリッドの外にコピーするとき

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; 

私は改行が保存されていることを確認することができ、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

この回答は、より多くの票が必要です。 p.s.新しいクエリウィンドウを作成するだけです。オプションを変更した後に再起動する必要はありません。 – mcNux

関連する問題