Sql Server - 回滚事务的正确语法

时间:2015-07-09 20:46:44

标签: sql-server

以下sql在RAISEERROR处给出了语法错误,如果我从查询中删除[Tran1],则会失败。回滚别名事务然后调用RAISERROR

的正确语法是什么
 BEGIN TRY
 BEGIN TRANSACTION [Tran1]
   ...sql goes here... 
 END TRY
 BEGIN CATCH
   ROLLBACK TRANSACTION [Tran1]
   RAISEERROR ('Error occured')
 END CATCH;

另外,如果我删除了[Tran1]我得到了:

  

无法回滚RAISEERROR。没有该名称的事务或保存点   被发现了。

2 个答案:

答案 0 :(得分:0)

您没有在'TRY'块中提及必要的COMMIT TRANSACTION [Tran1]。我认为你有这个。

RAISERROR会自动引发错误,因为它必须编码为

Cell Subclass B

带错误的RAISERROR语句将调用BEGIN CATCH部分,但ROLLBACK不再有任何事务。

答案 1 :(得分:0)

如果您没有丢失有关原始异常的信息,那就更好了。在 SQL Server 2012及更高版本中,确实有一个THROW子句用于此目的。所以你可以这样做:

BEGIN TRY
    BEGIN TRANSACTION [Tran1];
    --- Some SQL here --
    COMMIT TRANSACTION [Tra1];
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION [Tran1];

    THROW;
END CATCH;

SQL Server 2008R2及更低版本中,保留错误信息有点麻烦:

BEGIN TRY
    BEGIN TRANSACTION [Tran1];
    --- Some SQL here --
    COMMIT TRANSACTION [Tra1];
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION [Tran1];

    -- Now throw the exception
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;
    SELECT @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH;