2008-09-17 12 views
4

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

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

+0

質問は何ですか? – Sklivvz

+0

深刻な2または3レベルのネストされたストアドプロシージャでエラーが発生した場合、SQL Server 2005でtry/catchを処理するエラーを使用してこれを実現する方法を知りたい – HAdes

答えて

0

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

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秒はこのようなXMLブロックを返します返します。

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

お楽しみください