.netでSqlCommand
を使用し、RAISERROR
をスローするストアドプロシージャを呼び出すと、そのプロシージャで設定された出力変数を読み取ることができます。ただし、T-SQLバッチ内からそのプロシージャを呼び出すと、OUTPUT
のパラメータがまったく設定されないように見えます。RAISERRORを呼び出す前に、ストアドプロシージャによってバッチセット内のOUTPUTパラメータを読み取るにはどうすればよいですか?
RAISERROR
がエラーを示すときに、パラメータ@OUT_x
をT-SQLの呼び出しから読み取るにはどうすればよいですか?
CREATE PROCEDURE dbo.p_x (
@OUT_x INT OUTPUT
) AS
BEGIN
SET @OUT_x = 1;
SELECT 'inner ', @OUT_x;
RAISERROR('yo', 11, 1);
END
GO
DECLARE @x INT = 0;
SELECT 'initial', @x;
BEGIN TRY
EXEC dbo.p_x @x OUTPUT;
END TRY
BEGIN CATCH
SELECT 'catch', @x;
END CATCH
SELECT 'end', @x;
出力:
------- -----------
initial 0
------ -----------
inner 1
----- -----------
catch 0
---- -----------
end 0
私は@OUT_xがRAISERROR
経由投げる前に、ストアドプロシージャ内でその値を示すことによって、1
に設定したことを証明しました。私は "キャッチ"と "終了"のエントリが1
であると予想しましたが、OUTPUT
のパラメータ値のコピーは、ストアドプロシージャが正常に完了した場合にのみ発生します。 I know I can read these OUTPUT
parameters when I call stored procedures through SqlCommand
- T-SQLバッチはどのように異なる必要がありますか?
ストアドプロシージャの変更を伴わない回避策がありますか?私は実際に私のストアドプロシージャが例外的な状況で(RAISERROR
)をスローするようにしたいが、またエラーの詳細を伝えるのにOUTPUT
パラメータを使う必要がある。
T-SQLバッチは違いがありません。このコードブロック全体を 'SqlCommand'を通して実行した場合、同じ結果が得られます。あなたの質問は実際に 'TRY .. CATCH'が何をしているのか(ストアドプロシージャが' RAISERROR'を行うときに出力パラメータをコピーしない)についてです。アーランドはこれをカバーしています(http:// sommarskog。se/error_handling/Part2.html#systemfunctions)を、エラーハンドリングについての彼の無敵の記事で説明していますが、基本的にはこれが動作する方法です。 'TRY .. CATCH'を使うことはできず、エラーの前に割り当てられた出力パラメータの値も取得できます。 –
@ JeroenMostert 'SqlCommand'は、あなたが期待するようにパラメータに' 1'を返します。 – GSerg
@binki、@GSerg:あなたができることが分かっていても、私はそれをテストしていませんが、ここでの重要な問題は、 'try {...} catch {...}' T-SQLの 'TRY ... CATCH'と同じものではありません。私は 'TRY ... CATCH'を含むコードブロック全体を' SqlCommand'として実行することについて話しています。あなたは本当に結果が違うと私に伝えていますか?明らかに、可能ならば* T-SQLの外で*エラーを処理することができます。しかし、私はここでオプションではないことを正確に質問から集まります。 –