3

在 SQL Server 中,是否有类似于c# 块中的finally子句的内容?try..catch...

我的意思是,我BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN在 SQL Server 事务中使用 etc 并且想要一个部分或一组操作,无论成功、失败或事务如何都需要触发。

有解决方案吗?(类似于 finally 阻止 OOPS 语言的 try/catch)。

提前致谢

4

3 回答 3

3

没有任何东西会以 100% 的可靠性“不管成功或失败”运行。无论您是在谈论 C# 程序的“finally”子句,还是 SQL Server 上的 BEGIN TRY...END TRY BEGIN CATCH...END CATCH 结构,都没有关系。

问题是像这样的接线端子不能在所有可能的故障模式下执行。每种可能的故障模式都必须包括软件、硬件和网络故障。如果您的客户是政府,它可能也必须包括导弹攻击。

必须参考经典的 TheDailyWTF

于 2012-10-24T17:26:44.507 回答
2

事实上,BEGIN TRY... END TRY...BEGIN CATCH... END CATCHSQL Server 中有一个结构。我经常使用它。

这是一个概述——当然,关于选择错误信息的部分是可选的——在你的情况下做有意义的事情。

BEGIN TRY
        -- do something here.

    /*  Following line can be used to force termination for testing purposes.
        No data changes will be committed.
    */
    --RAISERROR('testing', 99, 1);

    PRINT 'Successful completion; committing transaction.';
    COMMIT TRAN;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    RAISERROR(N'Error occurred; rolling back and terminating.',18,1);
END CATCH;
于 2012-10-24T17:05:45.520 回答
0

最后一个每次都会引发错误,不是吗。

如果您想捕获回滚错误 - 您还需要将其放入 try..except 块中。

于 2013-08-12T12:08:50.700 回答