我遇到了这样的问题。我有这个事务,$(FilePath)指定另一个脚本,它应该开始运行。
BEGIN TRANSACTION
:r $(FilePath)
GO
IF(@@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
(请注意,sqlcmd调用的脚本大多不包含transacions) 问题是,如果被调用的脚本包含回滚事务,那么它也会回滚外部事务。内部脚本不包含命名事务,并且有太多脚本要重写每个要命名的事务。
如果相应的回滚事务运行,是否有办法使此事务仅回滚?
谢谢
答案 0 :(得分:4)
尝试将savepoint_name
与ROLLBACK
语句一起使用,如here所述:
如果没有此保存点,ROLLBACK语句将按事项将事务回滚到最外面的BEGIN TRANSACTION
语句。
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
没有savepoint_name或transaction_name的ROLLBACK TRANSACTION 回滚到交易的开头。嵌套时 在事务中,同一语句将所有内部事务回滚到 最外面的BEGIN TRANSACTION语句。在这两种情况下,ROLLBACK TRANSACTION将@@ TRANCOUNT系统函数递减为0. ROLLBACK TRANSACTION savepoint_name不会减少@@ TRANCOUNT。