我想编写一个执行多个单独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在做什么。
答案 0 :(得分:7)
自2005年以来,SQL Server一直有异常支持:
BEGIN TRY
BEGIN TRAN
INSERT INTO ...
COMMIT TRAN
END TRY
BEGIN CATCH
EXECUTE usp_LogAndRethrowError
END CATCH
然后,您的LogAndRethrowError可以回滚任何注定的事务,la:
-- Make sure we are not in a live or 'doomed' transaction
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
答案 1 :(得分:5)
这是我过去做过的一种方式:
Declare @HasError int;
set @HasError = 0;
BEGIN TRANSACTION
insert into TestTable values (1)
if (@@ERROR != 0)
set @HasError = 1
insert into TestTable values (2)
if (@@ERROR != 0)
set @HasError = 1
insert into TestTabe values (3)
if (@@ERROR != 0)
set @HasError = 1
if @HasError > 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
答案 2 :(得分:1)
我很懒,并在我的所有陈述中添加了这一行
SET XACT_ABORT ON
http://technet.microsoft.com/en-us/library/ms188792.aspx
当SET XACT_ABORT为ON时,如果a Transact-SQL语句提出了一个 运行时错误,整个事务 终止并回滚。
当SET XACT_ABORT为OFF时,在某些情况下 仅包含Transact-SQL语句 引发错误的回滚 并且交易继续 处理。取决于 错误的严重性,整个 交易甚至可以回滚 当SET XACT_ABORT为OFF时。关闭是 默认设置。
编译错误,例如语法错误, 不受SET XACT_ABORT的影响。
必须为数据设置XACT_ABORT 隐式修改语句 或针对大多数的显式交易 OLE DB提供程序,包括SQL 服务器。这是唯一的情况 选项不是必需的,如果 provider支持嵌套事务。 有关更多信息,请参阅分布式 查询和分布式事务。
设置SET XACT_ABORT的设置 在执行或运行时而不是在 解析时间。