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;
谢谢!
答案 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;