我想编写一个执行多个单独 SQL 语句的 SQL 脚本;如果这些语句中的任何一个失败,我想回滚整个事务。所以,像这样:
BEGIN TRANSACTION
insert into TestTable values (1)
insert into TestTable values (2)
insert into TestTabe values (3)
--if any of the statements fail
ROLLBACK
--else
COMMIT
这是针对 MS SQL 2008 的。有什么我可以做的吗?也许某种异常处理?
我意识到在我的示例中,我可以检查 TestTable 中的这些值并确定语句是否以这种方式失败。但实际上,我的 SQL 会复杂得多,我宁愿不知道 SQL 在做什么。
最佳答案
SQL Server 自 2005 年起就有异常支持:
BEGIN TRY
BEGIN TRAN
INSERT INTO ...
COMMIT TRAN
END TRY
BEGIN CATCH
EXECUTE usp_LogAndRethrowError
END CATCH
然后,您的 LogAndRethrowError 可以回滚任何注定失败的事务,例如:
-- Make sure we are not in a live or 'doomed' transaction
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
关于如果任何语句失败,将回滚的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238881/