我有很多使用CLR程序的MSSQL脚本。 .NET代码处理SQL异常并通知它们,如果它们绕过SQL错误处理。问题是,如果CLR抛出了无法处理的异常,SLQ脚本会将其写入Message窗口并继续执行脚本,就像没有发生任何事情一样。如何从CLR中抛出“致命的”T-SQL异常?
答案 0 :(得分:0)
我不认为抛出“致命”异常是可取的。相反,您应该TSQL决定退出是否正确。您经常需要释放应用程序锁等资源。
以下是TSQL中异常处理的文档:http://msdn.microsoft.com/en-us/library/ms175976.aspx
如果你想在任何异常上死掉,请将现有代码包装在空的try catch块中:
BEGIN TRY
existing statements
END TRY BEGIN CATCH END CATCH;
答案 1 :(得分:0)
对于这种特殊情况,我有一个使用CLR程序的多个脚本,它不是通过每个脚本并编辑它们的最佳解决方案,因为它可能会引发不可预测的行为。我发现这三种解决方案很有用。
予。 set xact_abort on
使CLR停止并在出错时回滚当前事务。如何使用它有多种变化。 (在每次调用之前或整个数据库之前)这也不是最好的解决方案,因为我不想编辑所有出现的过程,并且在整个数据库上设置xact_abort可能会做一些不可预测的事情。
II。重命名现有的CLR过程。在重命名之前,使用与CLR过程相同的参数和名称创建新过程。将此代码放入新的过程调用中。
set xact_abort on
exec renamed_clr_procedure @arg1=v1, @arg2=v2, ...
set xact_abort off
还可以检查xact_abort是否已经设置在第一位。然后我们应该只调用renamed_clr_procedure。
III。因为我注意到,所有SQL过程(包含CLR过程)调用来自一个地方,在我执行过程之前,我在过程之前调用set xact_abort on
,在过程之后调用set xact_abort off
。