Sql Server 2005 错误处理 - 内部异常

Sql Server 2005 error handling - inner exception

提问人:HAdes 提问时间:9/18/2008 最后编辑:Kevin FairchildHAdes 更新时间:11/18/2008 访问量:1587

问:

在 C# 中,可以获取原始错误,并使用传递的内部异常跟踪执行路径(堆栈跟踪)。我想知道当嵌套 2 或 3 级深的存储过程中发生错误时,如何使用 sql server 2005 中的错误处理 try/catch 来实现这一点。

我希望像 ERROR_MESSAGE()、ERROR_LINE()、ERROR_PROCEDURE()、ERROR_SEVERITY() 这样的函数可以很容易地传递到行上,以便顶级存储的 proc 可以访问它们。

SQL Server-2005 错误处理

评论

0赞 HAdes 9/18/2008
我想知道当嵌套 2 或 3 级深的存储过程中发生错误时,如何使用 sql server 2005 中的错误处理 try/catch 来实现这一点

答:

0赞 Daniel 9/18/2008 #1

一种方法是创建一个内存表,并在捕获异常时将行插入其中。然后,您将重新引发异常,然后链上的下一个函数将有机会处理该异常或将异常记录到内存表中。这很讨厌,但不幸的是,似乎没有办法让 T-SQL 调用堆栈:(

4赞 Josef 10/3/2008 #2

处理此问题的最佳方法是使用 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>

享受