代码之家  ›  专栏  ›  技术社区  ›  reustmd

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

  •  4
  • reustmd  · 技术社区  · 14 年前

    我想写一个执行多个单独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 回复  |  直到 14 年前
        1
  •  7
  •   Rowland Shaw    14 年前

    BEGIN TRY
        BEGIN TRAN
    
        INSERT INTO ...
    
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        EXECUTE usp_LogAndRethrowError
    END CATCH
    

    然后,您的LogandRetrowerr可以回滚任何注定失败的事务,即:

    -- Make sure we are not in a live or 'doomed' transaction
    IF XACT_STATE() <> 0
    ROLLBACK TRANSACTION
    
        2
  •  5
  •   Brettski    14 年前

    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
    
        3
  •  1
  •   jerryhung    14 年前

    我很懒,在我所有的陈述中都加了这一行

    SET XACT_ABORT ON
    

    http://technet.microsoft.com/en-us/library/ms188792.aspx

    运行时错误,整个事务

    在某些情况下,当SET XACT_ABORT关闭时 仅对Transact-SQL语句执行大小写 交易继续进行 错误的严重性,整个 当SET XACT_ABORT关闭时。关是门 默认设置。

    编译错误,例如语法错误,

    隐式语言中的修改语句 OLE DB提供程序,包括SQL 服务器。只有在这种情况下 提供程序支持嵌套事务。 有关更多信息,请参阅分布式 查询和分布式事务。

    已设置SET XACT_ABORT的设置 解析时间。