4

C# では、元のエラーを取得し、渡された内部例外を使用して実行パス (スタック トレース) をトレースできます。2 つまたは 3 つのレベルの深さでネストされたストアド プロシージャでエラーが発生したときに、SQL Server 2005 のエラー処理 try/catch を使用してこれをどのように達成できるかを知りたいです。

最上位のストアド プロシージャがアクセスできるように、ERROR_MESSAGE()、ERROR_LINE()、ERROR_PROCEDURE()、ERROR_SEVERITY() などの関数を簡単に渡すことができることを願っています。

4

2 に答える 2

4

これを処理する最善の方法は、OUTPUT パラメーターと XML を使用することです。以下のサンプル コードは、エラーへの応答をより適切に処理するために、TopProcedure で XML を使用して行う内容を変更する方法を示しています。

USE tempdb
go
CREATE PROCEDURE SubProcedure @RandomNumber int, @XMLErrors XML OUTPUT
AS
BEGIN
BEGIN TRY
    IF @RandomNumber > 50
        RaisError('Bad number set!',16,1)
    else
        select @RandomNumber
END TRY
BEGIN CATCH
    SET @XMLErrors = (SELECT * FROM (SELECT ERROR_MESSAGE() ErrorMessage, 
        ERROR_LINE() ErrorLine, ERROR_PROCEDURE() ErrorProcedure, 
        ERROR_SEVERITY() ErrorSeverity) a FOR XML AUTO, ELEMENTS, ROOT('root'))
END CATCH
END
go

CREATE PROCEDURE TopProcedure @RandomNumber int
AS
BEGIN
    declare @XMLErrors XML
    exec SubProcedure @RandomNumber, @XMLErrors OUTPUT
    IF @XMLErrors IS NOT NULL
        select @XMLErrors
END

go
exec TopProcedure 25
go
exec TopProcedure 55
go
DROP PROCEDURE TopProcedure
GO
DROP PROCEDURE SubProcedure
GO

TopProcedure への最初の呼び出しは 25 を返します。2 回目は次のような XML ブロックを返します。

<root>
  <a>
    <ErrorMessage>Bad number set!</ErrorMessage>
    <ErrorLine>6</ErrorLine>
    <ErrorProcedure>SubProcedure</ErrorProcedure>
    <ErrorSeverity>16</ErrorSeverity>
  </a>
</root>

楽しみ

于 2008-10-03T11:13:19.897 に答える
0

これを行う1つの方法は、メモリ内のテーブルを作成し、例外が発生したときにそのテーブルに行を挿入することです。次に、例外を再発生させ、チェーンの次の関数が例外を処理するか、メモリ内のテーブルに例外をログに記録する機会があります。厄介ですが、残念ながら、T-SQL呼び出しスタックを取得する方法はないようです:(

于 2008-09-18T00:36:11.523 に答える