SQL Server 2005には、デバッグしようとしている非常に長時間実行されるストアドプロシージャがあり、「print」コマンドを使用してデバッグしています。問題は、sprocの最後でSQL Serverからメッセージが返されるだけであるということです。メッセージバッファをフラッシュして、sprocの実行時にこれらのメッセージをすぐに表示できるようにしたいのです。終わり。
6 に答える
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
はい... 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 ステートメントを介してデータをすぐに表示できます。 . これは私にとって最もうまくいきます。永続的なテーブルを使用すると、過去に何が起こったかのログとしても機能します。print ステートメントはエラーに対して便利ですが、ログ テーブルを使用すると、その特定の実行について最後にログに記録された値に基づいて正確な障害点を特定することもできます (ログ テーブルで全体的な実行開始時間を追跡すると仮定します)。
参考までに、ストアド プロシージャではなくスクリプト (バッチ処理) で作業する場合、出力のフラッシュは GO コマンドによってトリガーされます。
print 'test'
print 'test'
go
一般的に、私の結論は次のとおりです。SMS GUI または sqlcmd.exe で実行される mssql スクリプト実行の出力は、最初の GO ステートメントで、またはスクリプトの最後まで、ファイル、stdoutput、gui ウィンドウにフラッシュされます。
GO を内部に配置できないため、ストアド プロシージャの内部をフラッシュすると、機能が異なります。
参考:tsql Go文