SQL Server 2005でキャッチしようとすると、ERROR_stuffを呼び出し元に送信する方法は?

StackOverflow https://stackoverflow.com/questions/1808766

質問

この手順があります

    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#)が例外を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top