繰り返し答える前に、私がここで受け入れる唯一の答えはKMによるものだと告白しています。その上。私は他の回答に反対票を投じました。なぜなら、それらのどれも実際に尋ねられた質問に答えなかったか、それらが適切でなかったからです。PRINT出力は確かにメッセージウィンドウに表示されますが、それはまったく要求されたものではありません。
ストアドプロシージャの実行中にPRINTステートメントの出力が表示されないのはなぜですか?
この回答の短いバージョンは、sprocの実行をSQLサーバーに送信し、トランザクション全体が完了するまで応答しないというものです。これは、この外部リンクにあるより良い答えです。
- さらに多くの意見/観察については、このSO投稿に注意を向けてください。
- Phil_factorによる同じ投稿のこの回答を具体的に見てください(ハハ!SQLのユーモアが大好きです)
- RAISERROR WITH NOWAITを使用する提案については、JimCardenによる同じ投稿のこの回答を参照してください。
これらのことをしないでください
- 一部の人々は、PRINTステートメントの後にGOステートメントを使用できるという印象を受けていますが、sproc内でGOステートメントを使用することはできません。そのため、解決策が出ました。
- 印刷ステートメントをSELECT化することはお勧めしません。これは、結果セットをナンセンスで混乱させるだけであり、sprocが後でプログラムによって消費されることになっている場合は、ループ時にスキップする結果セットを知る必要があるためです。データリーダーからの結果を介して。これは悪い考えなので、やらないでください。
- 印刷ステートメントをSELECT-INGする場合の別の問題は、それらが常にすぐに表示されるとは限らないことです。私はこれについてさまざまな実行でさまざまな経験をしたので、この方法論とのいかなる種類の一貫性も期待しないでください。
ストアドプロシージャ内のPRINTの代替手段
これは、構文が使用されているコンテキストで混乱するため、私の意見ではちょっと厄介な回避策ですが、将来Microsoftによって更新される可能性があることを誰が知っていますか。デバッグ情報を出力することだけを目的としてエラーを発生させるという考えは好きではありません...
すでに何度もRAISERRORWITHNOWAITで説明されているように、この問題を回避する唯一の方法は使用することのようです。私は例を提供し、このアプローチの小さな問題を指摘しています:
ALTER
--CREATE
PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample]
AS
BEGIN
SET NOCOUNT ON;
-- This will print immediately
RAISERROR ('RE Start', 0, 1) WITH NOWAIT
SELECT 1;
-- Five second delay to simulate lengthy execution
WAITFOR DELAY '00:00:05'
-- This will print after the five second delay
RAISERROR ('RE End', 0, 1) WITH NOWAIT
SELECT 2;
END
GO
EXEC [dbo].[PrintVsRaiseErrorSprocExample]
両方のSELECTステートメントの結果は、実行が終了した後にのみ表示され、printステートメントは上記の順序で表示されます。
このアプローチの潜在的な問題
PRINTステートメントとRAISERRORステートメントの両方が次々にあり、両方が印刷されるとします。これはバッファリングと関係があると確信していますが、これが発生する可能性があることに注意してください。
ALTER
--CREATE
PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2]
AS
BEGIN
SET NOCOUNT ON;
-- Both the PRINT and RAISERROR statements will show
PRINT 'P Start';
RAISERROR ('RE Start', 0, 1) WITH NOWAIT
SELECT 1;
WAITFOR DELAY '00:00:05'
-- Both the PRINT and RAISERROR statements will show
PRINT 'P End'
RAISERROR ('RE End', 0, 1) WITH NOWAIT
SELECT 2;
END
GO
EXEC [dbo].[PrintVsRaiseErrorSprocExample2]
したがって、ここでの回避策は、PRINTとRAISERRORの両方を使用せず、どちらか一方を選択することです。sprocの実行中に出力を表示する場合は、RAISERRORWITHNOWAITを使用します。