当错误发生时,事务会自动回滚,并且当前批次被中止。
然而,执行会继续到下一批。因此,错误发生后批次中的所有内容都会被执行。然后,当您稍后检查错误时,您会尝试回滚已经回滚的事务。
此外,要停止整个脚本,而不仅仅是当前批次,您应该使用:
raiserror('Error description here', 20, -1) with log
See 我的回答在这里 https://stackoverflow.com/questions/659188/sql-server-stop-or-break-execution-of-a-sql-script/804811#804811有关该内容的详细信息。
所以你需要检查@error
每批之后,我认为这样的事情应该有效:
BEGIN TRANSACTION
GO
ALTER Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
CREATE New Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
DROP Old Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION