50

SQL Server Management Studio 2008でストアドプロシージャをデバッグしようとしています。間違っていることがわかっているIFステートメントをテストするために、いくつかのprintステートメントを挿入したいと思います。

デバッグを行うために、PRINT '5'コマンドを使ってみました。

RAISERRORのようなものを使ってみました'RAISERROR (N'Start',10,1) WITH NOWAIT'

しかし、これらはプリントアウトを表示せず、結果セットのみを表示しました。メッセージには、とだけ書かれて1 row affectedいます。

私はそのようにコードを書き込もうとしました(おそらくこれは間違ったアプローチです):

SET NOCOUNT ON         
RAISERROR (N'Start',10,1) WITH NOWAIT    
DECLARE @DocHandle INT        
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT        
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50) 
DECLARE @CreatedOn varchar(25), @SystemGenerate bit   

printステートメントを使用してストアドプロシージャをデバッグするための最良の方法は何ですか?

4

5 に答える 5

39

Microsoft SQL Server Management Studio(SSMS)を使用している場合、印刷ステートメントは、[結果]タブではなく、[メッセージ]タブで印刷されます。

ここに画像の説明を入力してください

印刷ステートメントがそこに表示されます。

于 2013-03-14T15:19:20.433 に答える
21

これは、printステートメントの使用例です。前の人が示したように、メッセージタブの下に表示されます。

Declare @TestVar int = 5;

print 'this is a test message';
print @TestVar;
print 'test-' + Convert(varchar(50), @TestVar);

メッセージを印刷する

于 2015-05-28T20:02:06.690 に答える
19

繰り返し答える前に、私がここで受け入れる唯一の答えはKMによるものだと告白しています。その上。私は他の回答に反対票を投じました。なぜなら、それらのどれも実際に尋ねられた質問に答えなかったか、それらが適切でなかったからです。PRINT出力は確かにメッセージウィンドウに表示されますが、それはまったく要求されたものではありません。

ストアドプロシージャの実行中にPRINTステートメントの出力が表示されないのはなぜですか?
この回答の短いバージョンは、sprocの実行をSQL​​サーバーに送信し、トランザクション全体が完了するまで応答しないというものです。これは、この外部リンクにあるより良い答えです。

  • さらに多くの意見/観察については、このSO投稿に注意を向けてください
  • Phil_factorによる同じ投稿のこの回答を具体的に見てください(ハハ!SQLのユーモアが大好きです)
  • RAISERROR WITH NOWAITを使用する提案については、JimCardenによる同じ投稿のこの回答を参照してください。

これらのことをしないでください

  1. 一部の人々は、PRINTステートメントの後にGOステートメントを使用できるという印象を受けていますが、sproc内でGOステートメントを使用することはできません。そのため、解決策が出ました。
  2. 印刷ステートメントをSELECT化することはお勧めしません。これは、結果セットをナンセンスで混乱させるだけであり、sprocが後でプログラムによって消費されることになっている場合は、ループ時にスキップする結果セットを知る必要があるためです。データリーダーからの結果を介して。これは悪い考えなので、やらないでください。
  3. 印刷ステートメントを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を使用します。

于 2016-06-01T21:45:18.060 に答える
15

使用してみてください:

RAISERROR('your message here!!!',0,1) WITH NOWAIT

デフォルトのツールバーの「実行」の右側にあるいくつかのアイコンである「結果からテキスト」に切り替えることもできます。

上記の両方を実行し、それでもメッセージが表示されない場合は、編集しているプロシージャと同じサーバー/データベース/所有者バージョンを実行していることを確認してください。RAISERRORコマンドを押していることを確認し、それをプロシージャ内の最初のコマンドにします。

他のすべてが失敗した場合は、テーブルを作成できます。

create table temp_log (RowID int identity(1,1) primary key not null
                      , MessageValue varchar(255))

それから:

INSERT INTO temp_log VALUES ('Your message here')

次に、手順を実行した後(ロールバックが提供されていない場合)、selectテーブルのみ。

于 2013-03-14T15:40:36.213 に答える
0

MSDNドキュメントのこのハウツーを参照してください。Transact - SQLデバッガーを実行します。これはPRINTステートメントではありませんが、コードのデバッグに役立つ可能性があります

このYouTubeビデオ:SQL Server 2008 T-SQLデバッガーは、デバッガーの使用法を示しています。

=>ストアドプロシージャはTransact-SQLで記述されています。これにより、すべてのTransact-SQLコードをデバッグできるため、ブレークポイントを定義して変数を監視するVisualStudioでのデバッグに似ています。

于 2017-03-07T13:45:12.023 に答える