开发者社区> 问答> 正文

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

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

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

展开
收起
心有灵_夕 2019-12-28 23:22:11 1117 0
1 条回答
写回答
取消 提交回答
  • 处理此问题的最佳方法是使用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>
    
    2019-12-28 23:22:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载