长脚本包括GO命令 - 如果失败则撤消

时间:2011-07-27 21:59:38

标签: sql sql-server sql-server-2008

我有一个巨大的sql脚本,它在我的数据库方案和数据中进行了很多更改。该脚本包括GO命令。

有没有办法执行脚本并在出现任何错误时将其撤消?

由于有GO命令,我无法将所有内容包装在事务中。

2 个答案:

答案 0 :(得分:2)

你可以在一个事务中包装多个批次,你错了,但事实是复杂的升级脚本不可能在一个单独的事务中执行。您的最佳解决方案是进行备份,如果脚本失败,则从备份中恢复数据库。

答案 1 :(得分:1)

最好的方法是使用SET XACT_ABORT ON。这是批量中止并执行自动回滚。所以......

SET XACT_ABORT ON
GO
BEGIN TRAN
GO
--DO stuff
GO
IF XACT_STATE() = 1
  --do more stuff
GO
IF XACT_STATE() = 1
  --do more stuff
GO
....
GO
IF XACT_STATE() = 1
  COMMIT TRAN
GO

您可以将它与每批次的TRY / CATCH结合使用和/或使用临时表来控制流程(根据Red Gate SQL Compare脚本)