JNK*_*JNK 6 sql-server stored-procedures sql-server-2008-r2 error-handling
在我的环境中,我们有很多调用子过程的容器过程,这些过程可能会无限调用其他过程。
就我个人而言,我通常TRY/CATCH
在每个级别的程序中使用。这有时会导致多个重复的错误消息,但很清楚发生了什么以及在什么过程中。
我有一些同事采取不同的方法。即: - 让每个存储的 proc 发出一个返回码 - 在执行后评估每个存储的 proc 的返回码 - 如果收到错误的返回码,则在最外层的 proc 中引发错误
我相信他们这样做,所以他们可以从示数程序实际行号(而不是让它返回的行号RAISERROR
的CATCH
块)。
对我来说,这似乎更难实现和维护,但我不是 SQL Server 错误处理方面的专家,所以我想我会在这里提出它。
在处理集装箱程序中的错误时,这两种方法是否有任何实质性优势?
我混合使用两者。每当我执行插入/更新/删除时,或者即使我正在进行关键选择(例如绝对必须返回数据的选择,或从远程数据集中进行选择)时,我都会使用 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,它将引发自己的错误。
当存在多个嵌套过程调用时,您会得到级联效果,但错误消息清楚地表明发生了什么以及发生在哪里。
归档时间: |
|
查看次数: |
2019 次 |
最近记录: |