【发布时间】:2013-02-22 00:51:22
【问题描述】:
我创建了一个存储过程,它运行许多命令来修改数据。如果一切顺利,我只想提交交易。我通过以下方式使用 try-catch 块来执行此操作(其中我的 CATCH 块在实际中使用 RAISERROR 来返回错误消息):
BEGIN TRY
BEGIN TRANSACTION
UPDATE Table1 SET MyVarcharColumn = 'test'
UPDATE Table2 SET MyBitColumn = 1
UPDATE Table3 SET MyIntColumn = 42
COMMIT TRANSACTION
END TRY
CATCH
ROLLBACK TRANSACTION
END CATCH
这就是我想要的方式。例如,如果我将 MyBitColumn 设置为 'b' 而不是 1,则会捕获错误,控制流向 CATCH,并且不会提交事务。
我注意到的一个问题是,如果 Table3 在数据库中不存在,那么它会出错(无效的对象名称),但 CATCH 块永远不会执行并且事务保持打开状态。
我想处理此问题以处理任何(远程)数据库被修改的可能性(或者在正确添加此存储过程但其中一个表未添加的情况下发生某些事情)。
我应该如何处理这些错误情况?
-感谢您的帮助。
【问题讨论】:
标签: sql database sql-server-2005 transactions try-catch