在 SQL Server 中,是否有类似于c# 块中的finally
子句的内容?try..catch...
我的意思是,我BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN
在 SQL Server 事务中使用 etc 并且想要一个部分或一组操作,无论成功、失败或事务如何都需要触发。
有解决方案吗?(类似于 finally 阻止 OOPS 语言的 try/catch)。
提前致谢
在 SQL Server 中,是否有类似于c# 块中的finally
子句的内容?try..catch...
我的意思是,我BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN
在 SQL Server 事务中使用 etc 并且想要一个部分或一组操作,无论成功、失败或事务如何都需要触发。
有解决方案吗?(类似于 finally 阻止 OOPS 语言的 try/catch)。
提前致谢
没有任何东西会以 100% 的可靠性“不管成功或失败”运行。无论您是在谈论 C# 程序的“finally”子句,还是 SQL Server 上的 BEGIN TRY...END TRY BEGIN CATCH...END CATCH 结构,都没有关系。
问题是像这样的接线端子不能在所有可能的故障模式下执行。每种可能的故障模式都必须包括软件、硬件和网络故障。如果您的客户是政府,它可能也必须包括导弹攻击。
必须参考经典的 TheDailyWTF。
事实上,BEGIN TRY... END TRY...BEGIN CATCH... END CATCH
SQL 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;
最后一个每次都会引发错误,不是吗。
如果您想捕获回滚错误 - 您还需要将其放入 try..except 块中。