1

我正在尝试为存储过程中的错误处理提供一个模板,或者只是能够处理 99% 的故障或错误的一般语句。

在网上查找了 SQL 事务和 try-catch 的不同示例后,我想出了这个模板,我想与一些同事分享 想看看是否有人认为我遗漏了一些东西。

BEGIN TRY
   BEGIN TRAN
      --Place code in here. 



      --Your Code Ends Here
   COMMIT
END TRY
BEGIN CATCH
   -- There was an error
   IF @@TRANCOUNT > 0
   ROLLBACK --Rolls back from where error first discovered. All code after error not run.

   -- Raise an error with the details of the exception
   DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int

   SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY()
   RAISERROR(@ErrMsg, @ErrSeverity, 1) --This will be picked up by .NET Exception handler.
END CATCH

谢谢!

4

1 回答 1

1

根据 proc 的功能,有时最好在日志表中存储有关错误的更多数据。例如,您可能不仅要存储错误消息,还要存储发送到 proc 中的参数,以便您可以准确了解导致问题的数据进行故障排除。如果您在 proc 中有许多步骤,就像我们通常对复杂插入所做的那样,您可能希望存储有关错误发生时您所处的步骤的信息,因为在面对 1000 行 proc 时,一些错误消息可能没有帮助。我这样做的方法是在开头设置一个表变量,其中包含我要存储在日志表中的字段。然后在我完成步骤时向其中插入数据。我可以选择将所有步骤存储在表变量中,或者在运行之前用新步骤的数据替换每个步骤。然后,当您点击 catch 块时,使用错误消息数据更新表变量。回滚事务后表变量仍然可用,因此您可以在回滚后使用该表变量插入日志记录表。当 proc 很少失败时,这对于诊断问题特别有帮助。

于 2013-04-30T17:33:30.020 回答