如果任何语句失败,则会回滚的SQL查询

时间:2010-02-10 17:22:28

标签: sql sql-server-2008 exception-handling

我想编写一个执行多个单独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在做什么。

3 个答案:

答案 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的设置   在执行或运行时而不是在   解析时间。