web-dev-qa-db-ja.com

SQLでPRINTバッファーをフラッシュするにはどうすればよいですか?

デバッグしようとしているSQL Server 2005に非常に長時間実行されているストアドプロシージャがあり、それを行うために 'print'コマンドを使用しています。問題は、sprocの最後でのみSQL Serverからメッセージを取得していることです。終わり。

207
Erik Forbes

RAISERROR 関数を使用します。

RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT

すべてのプリントをレイザーで完全に置き換えるべきではありません。ループまたは大きなカーソルがある場合は、反復ごとに1回または2回、または数回の反復ごとにそれを行います。

また、私はこのリンクでRAISERRORについて最初に学びました。これは、SQL Serverエラー処理の決定的なソースであり、間違いなく読む価値があると考えています。
http://www.sommarskog.se/error-handling-I.html

294
Joel Coehoorn

@JoelCoehoornの答えに基づいて、私のアプローチは、すべてのPRINTステートメントをそのままにして、それらの後にRAISERRORステートメントを続けてフラッシュを発生させることです。

例えば:

PRINT 'MyVariableName: ' + @MyVariableName
RAISERROR(N'', 0, 1) WITH NOWAIT

このアプローチの利点は、PRINTステートメントで文字列を連結できるのに対し、RAISERRORではできないことです。 (どちらの方法でも、RAISERRORで使用する変数を宣言して設定する必要があるため、同じ行数のコードがあります)。

私のように、AutoHotKey、SSMSBoost、または同等のツールを使用する場合、「] flush」などのショートカットを簡単に設定して、RAISERROR行を入力できます。毎回同じコード行である場合、つまり特定のテキストまたは変数を保持するためにカスタマイズする必要がない場合、これにより時間を節約できます。

19
Mike

はい... RAISERROR関数の最初のパラメーターにはNVARCHAR変数が必要です。以下を試してください。

-- Replace PRINT function
DECLARE @strMsg NVARCHAR(100)
SELECT @strMsg = 'Here''s your message...'
RAISERROR (@strMsg, 0, 1) WITH NOWAIT

OR

RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT
17
tcbrazil

もう1つの優れたオプションは、PRINTまたはRAISERRORに依存せず、TempDBの## Tempテーブルまたはデータベースの永続テーブルに「print」ステートメントをロードすることです。これにより、別のウィンドウのSELECTステートメントでデータをすぐに表示できます。これは私に最適です。パーマネントテーブルを使用すると、過去の出来事のログとしても機能します。印刷ステートメントはエラーには便利ですが、ログテーブルを使用すると、特定の実行の最後に記録された値に基づいて障害の正確なポイントを特定することもできます(ログテーブルで全体の実行開始時間を追跡すると仮定します)。

11
Eric Isaacs

参考のために、ストアドプロシージャではなくスクリプト(バッチ処理)で作業している場合、GOコマンドによってフラッシュ出力がトリガーされます。

print 'test'
print 'test'
go

一般に、私の結論は次のとおりです。SMS GUIまたはsqlcmd.exeで実行されるmssqlスクリプト実行の出力は、最初のGOステートメントまたはスクリプトの最後まで、ファイル、stdoutput、guiウィンドウにフラッシュされます。 。

GOを内部に配置することはできないため、ストアドプロシージャの内部のフラッシュは別の方法で機能します。

参照: tsql Goステートメント

4
Robert Lujo