我创建了一个存储过程,它运行许多命令来修改数据。如果一切顺利,我只想提交交易。我通过以下方式使用 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 块永远不会执行并且事务保持打开状态。
我想处理这个问题以处理数据库被修改的任何(远程)可能性(或者在正确添加此存储过程但其中一个表没有发生的情况下发生某些事情)。
我应该如何处理这些错误情况?
-谢谢你的帮助。