3

这个 StackOverflow 答案提供了一种使用 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;

谢谢!

4

2 回答 2

5

在 Catch 语句中获取错误代码和消息。然后简单地再次提高它。下面展示了几个例子。

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

(根据评论中的 RBarryYoung)

CATCH子句中,只需使用THROW

于 2013-08-21T21:07:21.480 回答
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;
于 2013-08-21T21:36:30.580 回答