是否可以在不抑制错误的情况下回滚SQL Server事务?

时间:2013-08-21 21:02:47

标签: sql-server sql-server-2008-r2

This StackOverflow answer提供了一种使用TRY CATCH ROLLBACK TRANSACTION的优雅方法,但它可以抑制错误信息。

有没有办法回滚一个不会首先抑制导致回滚的错误的事务?

以下是基于上述方法的示例T-SQL脚本:

DECLARE @Table TABLE ( ID INT PRIMARY KEY )

BEGIN TRY

    BEGIN TRANSACTION

        INSERT INTO @Table VALUES (1), (1)

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION

END CATCH;

谢谢!

2 个答案:

答案 0 :(得分:5)

在Catch语句中获取错误代码和消息。然后再简单地升起它。以下是一些例子。

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

(根据评论中的每个RBarryYoung)

CATCH子句中,只需使用THROW

即可

答案 1 :(得分:1)

对于后代,我在这里包含了与SQL Server 2008R相同的THROW。

这是来自下一页标有“从CATCH块返回错误信息”的部分:

http://technet.microsoft.com/en-us/library/ms178592(v=sql.105).aspx

BEGIN TRY
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block.
    RAISERROR ('Error raised in TRY block.', -- Message text.
               16, -- Severity.
               1 -- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    -- Use RAISERROR inside the CATCH block to return error
    -- information about the original error that caused
    -- execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;