容器过程中的错误处理

JNK*_*JNK 6 sql-server stored-procedures sql-server-2008-r2 error-handling

我知道并使用了这个问题中的技术

在我的环境中,我们有很多调用子过程的容器过程,这些过程可能会无限调用其他过程。

就我个人而言,我通常TRY/CATCH在每个级别的程序中使用。这有时会导致多个重复的错误消息,但很清楚发生了什么以及在什么过程中。

我有一些同事采取不同的方法。即: - 让每个存储的 proc 发出一个返回码 - 在执行后评估每个存储的 proc 的返回码 - 如果收到错误的返回码,则在最外层的 proc 中引发错误

我相信他们这样做,所以他们可以从示数程序实际行号(而不是让它返回的行号RAISERRORCATCH块)。

对我来说,这似乎更难实现和维护,但我不是 SQL Server 错误处理方面的专家,所以我想我会在这里提出它。

在处理集装箱程序中的错误时,这两种方法是否有任何实质性优势?

dat*_*god 0

我混合使用两者。每当我执行插入/更新/删除时,或者即使我正在进行关键选择(例如绝对必须返回数据的选择,或从远程数据集中进行选择)时,我都会使用 Try/Catch

在每个存储过程中,我都有一个错误处理部分,它调用一个名为 GetErrorInfo 的函数,该函数收集相关的错误消息数据。

  select  @output =  ' (ERROR: ' + isnull(CAST(ERROR_NUMBER()   AS VARCHAR(10)),'(UNKNOWN ERROR)')
                  +  ','         + isnull(CAST(ERROR_SEVERITY() AS VARCHAR(10)),'(UNKNOWN SEVERITY)')
                  +  ','         + isnull(CAST(ERROR_STATE()    AS VARCHAR(10)),'(UNKOWN ERROR_STATE)')
                  +  ' Msg: '    + isnull(ERROR_MESSAGE(),                      '(UNKNOWN ERROR_MESSAGE)')
                  +  ' Line: '   + isnull(CAST(ERROR_LINE()     AS VARCHAR),    '(UNKNOWN ERROR_LINE)')
                  +  ' Proc: '   + isnull(ERROR_PROCEDURE(),                    '(UNKNOWN ERROR_PROCEDURE)')
                  + ') '
  RETURN @output
Run Code Online (Sandbox Code Playgroud)

此数据用作 RAISERROR with LOG 语句的一部分,然后存储过程退出并返回代码 -1。

调用过程总是检查返回码,如果它小于 0,它将引发自己的错误。

当存在多个嵌套过程调用时,您会得到级联效果,但错误消息清楚地表明发生了什么以及发生在哪里。