2016-10-01 12 views
2

ストアドプロシージャの実行中に現在のすべての変数値のリストを出力できますか?バッチ/ストアドプロシージャTSQLの実行内でスコープ付き変数値を出力する

コンテキストのために、ストアドプロシージャがエラーをスローしてトラブルシューティングを行う際にどのような変数値が使用されているかがわかります。もちろん、このロギングをハードコードされた変数値とともに手動でcatchブロックに入れることはできますが、それはクリーンでも転送可能でもありません。

動的SQLは機能しないため、sys.parametersを使用することはできません(パラメータを指定しても使用できません)。実行中に出力される可能性のある現在のスコープの変数を格納する変数またはsysテーブルが組み込まれていますか?

BEGIN TRY 
    DECLARE @Variable1 VARCHAR(64) = 'test' 
    -- Do stuff 
END TRY 
BEGIN CATCH 
    EXEC SpCustomLog @VariableValues = @Variable1 -- hardcoded 
    EXEC sp_execute 'SELECT @Variable1' -- not in scope/lost in build 
END CATCH 
+1

AFAIK、これはT-SQLでは実行できません。私は、他のプログラミング言語でどのように現在のスコープ内のすべての変数を総括的に記録するのか不思議です。 –

答えて

1

ローカル変数を使用していますが、これはスコープからアクセスできません。 TechNetはまた、それを述べたように:

変数のスコープは は変数を参照することができることのTransact-SQLステートメントの範囲です。変数のスコープは、それが宣言されている にバッチまたはストアドプロシージャの終わりまで宣言されている ポイントから続きます。変数にはローカルスコープがあり、定義されているバッチまたはプロシージャ内には しか表示されません。 (!セッションに限る)

しかし、あなたはそれがあまりにもバッチを定義していますからアクセス可能である、変数を宣言するために、SQLCMDを使用することができます

ここではコードです:

--deifne a variable using SQLCMD mode 
:setvar myvar 10 
PRINT $(myvar)--accessible 

GO 

PRINT $(myvar)--Also accessible 

ためには、 SQLCMDモードを有効にするには、SQLCMD modeQueryメニューから選択する必要があります。

+0

ありがとうございました - 隠されたテーブルが残っているかどうかはわかりませんでした。 SQLCMDは興味深い点ですが、あなたの入力に感謝します – Richard

+1

リチャード、残念ながら、上記の理由から、これらは一時的なオブジェクトであり、プロセス自体の範囲内で人生に持ち込まれるため、テーブルは存在しません。ただし、syscomments.textをスキャンし、可能な変数を決定することは可能ですが、すべての変数を考慮し、パラメーター、表、変数をデータ型とともに区別するために、ある程度のレベルのコーディングが必要です。 – LogicalMan

関連する問題