SQL Server 2005でキャッチしようとすると、ERROR_stuffを呼び出し元に送信する方法は?
-
05-07-2019 - |
質問
この手順があります
CREATE PROCEDURE dbo.test1
AS
BEGIN
begin transaction
begin try
exec dbo.test2
commit transaction
end try
begin catch
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage
rollback transaction
end catch
END
そしてこれ
CREATE PROCEDURE dbo.test2
AS
BEGIN
begin transaction
begin try
commit transaction
end try
begin catch
rollback transaction
if @@trancount = 0
begin
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage
end
else
--return the select above to the parent while raising an error
end catch
END
呼び出し元の親にエラーを再スローする方法
これができるとわかっています;
raiserror(ERROR_MESSAGE(),ERROR_SEVERITY(),ERROR_STATE())
しかし、 ERROR_LINE()、 ERROR_PROCEDURE()、および ERROR_NUMBER()を取得する方法は?
可能であれば、すべてのキャッチで同じ選択を実行できる必要があります
解決
子sprocで raiserror を使用します。
他のヒント
必要なものとRAISERRORを再度連結するために、すべてのcatchブロックで呼び出すストアドプロシージャ(udfでしたが、例外ログを追加しました)を使用します。
呼び出し側ストアドプロシージャは、エラーハンドラプロシージャを再度呼び出して、情報などを追加します。
catchブロックスコープ内にあるため、ERROR_xxx()関数はエラーハンドラprocで使用できます。
最終的に、クライアント(この例ではc#)が例外を取得します。
所属していません StackOverflow