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

时间:2020-03-05 19:00:10  来源:igfitidea点击:

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

我希望像ERROR_MESSAGE(),ERROR_LINE(),ERROR_PROCEDURE(),ERROR_SEVERITY()之类的函数可以轻松地向上传递,以便顶层存储的proc可以访问它们。

解决方案

回答

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

回答

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

享受