在SQL脚本中处理错误时寻找最佳实践

时间:2013-04-30 16:35:14

标签: tsql templates transactions

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

在网上查找了不同的SQL事务和尝试捕获示例后,我想出了这个模板,我想与一些同事分享,想知道是否有人认为我错过了什么。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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