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

man*_*u08 4 sql exception-handling sql-server-2008

我想编写一个执行多个单独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
Run Code Online (Sandbox Code Playgroud)

这适用于MS SQL 2008.有什么我可以做到的吗?也许某种异常处理?

我在实例中意识到我可以检查TestTable中的这些值并确定语句是否以这种方式失败.但实际上我的SQL会复杂得多,而且我宁愿抽象自己知道SQL在做什么.

Row*_*haw 7

SQL Server自2005年以来一直有异常支持:

BEGIN TRY
    BEGIN TRAN

    INSERT INTO ...

    COMMIT TRAN
END TRY
BEGIN CATCH
    EXECUTE usp_LogAndRethrowError
END CATCH
Run Code Online (Sandbox Code Playgroud)

然后,您的LogAndRethrowError可以回滚任何注定的事务,la:

-- Make sure we are not in a live or 'doomed' transaction
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
Run Code Online (Sandbox Code Playgroud)


Bre*_*ski 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
Run Code Online (Sandbox Code Playgroud)