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