2008-09-17 4 views
4

In C# können Sie den ursprünglichen Fehler erhalten und verfolgen den Ausführungspfad (Stack-Trace) mit der inneren Ausnahme, die übergeben wird. Ich würde gerne wissen, wie dies erreicht werden kann mit der Fehlerbehandlung try/catch in SQL Server 2005, wenn ein Fehler in einer gespeicherten Prozedur geschachtelt 2 oder 3 Ebenen tief auftritt.Sql Server 2005 Fehlerbehandlung - innere Ausnahme

Ich hoffe, dass Funktionen wie ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_SEVERITY() leicht über die Zeile übergeben werden, so dass die oberste Ebene gespeicherten Proc auf sie zugreifen können.

+0

Was ist die Frage? – Sklivvz

+0

Ich würde gerne wissen, wie dies mit der Fehlerbehandlung try/catch in SQL Server 2005 erreicht werden kann, wenn ein Fehler in einer gespeicherten Prozedur verschachtelte 2 oder 3 Ebenen tief auftritt – HAdes

Antwort

0

Eine Möglichkeit, dies zu tun, wäre, eine In-Memory-Tabelle zu erstellen und Zeilen einzufügen, wenn Sie eine Ausnahme abfangen. Sie würden dann die Ausnahme erneut auslösen, und die nächste Funktion in der Kette hätte dann eine Chance, die Ausnahme zu behandeln oder auch die Ausnahme in der Tabelle im Speicher zu protokollieren. Es ist ekelhaft, aber leider scheint es keine Möglichkeit zu geben, den T-SQL-Aufrufstack zu bekommen :(

4

Der beste Weg, dies zu handhaben, ist die Verwendung von OUTPUT-Parametern und XML. Der folgende Beispielcode wird Ihnen und Ihnen zeigen . kann ändern, was Sie in der TopProcedure mit dem XML tun, um besser auf Ihre Antwort auf den Fehler zu behandeln

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 

der erste Aufruf zu TopProcedure 25. der zweite zurückkehren wird eine XML-Block zurück, die wie folgt aussieht:

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

Genießen Sie