SQL Server 2005に非常に長時間実行されるストアドプロシージャがあり、これをデバッグしようとしています。そのために 'print'コマンドを使用しています。問題は、sprocの最後にのみSQL Serverからメッセージを取得していることです。メッセージバッファーをフラッシュして、sprocのランタイム中にではなく、sprocの実行中にこれらのメッセージをすぐに確認できるようにしたいのです。終わり。
SQL Server 2005に非常に長時間実行されるストアドプロシージャがあり、これをデバッグしようとしています。そのために 'print'コマンドを使用しています。問題は、sprocの最後にのみSQL Serverからメッセージを取得していることです。メッセージバッファーをフラッシュして、sprocのランタイム中にではなく、sprocの実行中にこれらのメッセージをすぐに確認できるようにしたいのです。終わり。
回答:
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
@JoelCoehoornの回答に基づいて、私のアプローチは、すべてのPRINTステートメントをそのままにして、それらの後にRAISERRORステートメントを実行するだけでフラッシュを実行することです。
例えば:
PRINT 'MyVariableName: ' + @MyVariableName
RAISERROR(N'', 0, 1) WITH NOWAIT
このアプローチの利点は、PRINTステートメントが文字列を連結できるのに対して、RAISERRORはできないことです。(つまり、RAISERRORで使用する変数を宣言して設定する必要があるため、どちらの方法でも同じ行数のコードを使用できます)。
私のように、AutoHotKey、SSMSBoost、または同等のツールを使用している場合は、 "] flush"などのショートカットを簡単に設定して、RAISERROR行を入力できます。毎回同じコード行である場合、つまり特定のテキストや変数を保持するためにカスタマイズする必要がない場合、これにより時間を節約できます。
RAISERROR()
は- printf()
形式の文字列補間をサポートしています。例えば、場合@MyVariableName
stringishタイプ(例えば、あるVARCHAR(MAX)
、NVARCHAR(MAX)
など)は、使用することができますRAISERROR()
1行で:RAISERROR(N'MyVariableName: %s', 0, 1, @MyVariableName)
。
はい... RAISERROR関数の最初のパラメーターには、NVARCHAR変数が必要です。したがって、以下を試してください。
-- Replace PRINT function
DECLARE @strMsg NVARCHAR(100)
SELECT @strMsg = 'Here''s your message...'
RAISERROR (@strMsg, 0, 1) WITH NOWAIT
または
RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT
別のより良いオプションは、PRINTやRAISERRORに依存せず、「print」ステートメントをTempDBの## Tempテーブルまたはデータベースの永続テーブルにロードすることです。これにより、別のウィンドウからSELECTステートメントを介してデータを即座に表示できます。 。これは私にとって最も効果的です。永続的なテーブルを使用すると、過去に何が起こったかのログとしても機能します。印刷ステートメントはエラーの場合に便利ですが、ログテーブルを使用すると、その特定の実行について最後にログに記録された値に基づいて、障害の正確なポイントを特定することもできます(ログテーブルで全体の実行開始時間を追跡するとします)。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
監視セッションで使用することで、ライブでクエリを実行できます
READ UNCOMMITTED
トランザクション内のデータを別のテーブルにコピーすることもできますが、直前の瞬間を見逃している可能性がありますROLLBACK
。したがって、おそらく「どこまで」を解決するでしょう。「ロールバックする理由」ではありません
参考までに、ストアドプロシージャではなくスクリプト(バッチ処理)で作業している場合、出力のフラッシュはGOコマンドによってトリガーされます。
print 'test'
print 'test'
go
一般的に、私の結論は次のとおりです。SMSGUIまたはsqlcmd.exeで実行されるmssqlスクリプト実行の出力は、最初のGOステートメントで、またはスクリプトの終わりまで、ファイル、stdoutput、guiウィンドウにフラッシュされます。
ストアドプロシージャ内のフラッシュは、GOを内部に配置できないため、機能が異なります。
リファレンス:tsql Goステートメント
go
出力をフラッシュするだけでなく、指定したリンクに従ってバッチを終了します。あなたが何かdeclare
Dは、デバッグのためのとても使用できない、破棄されます。declare @test int print "I want to read this!" go set @test=5
ただし@test
、新しいバッチに含まれているため、未定義のエラーは未定義です。