Ste*_* S. 70 sql-server raiserror
我最好的谷歌结果是这样的:
但是,从BOL,"任何用户都可以指定从0到18的严重级别".
在我的特定存储过程中,我希望将错误返回到.Net客户端应用程序,因此看起来11-18之间的任何严重性级别都可以解决问题.有没有人有关于每个级别的含义以及如何使用它们的任何权威信息?
Rem*_*anu 102
您应该返回16.是默认的,最常用的错误级别:
表示可由用户更正的一般错误.
不要返回17-18,那些表示更严重的错误,如资源问题:
指出用户无法纠正的软件错误.通知您的系统管理员该问题.
也不要返回11-15,因为它们具有附加到每个级别的特殊含义(14 - 安全访问,15 - 语法错误,13 - 死锁等).
16级不会终止执行.
如果您打算记录警告但继续执行,请使用低于10的严重性级别.
严重级别16
可以终止执行。
RAISERROR()
严重性为16时,将终止对违规行以下所有内容的执行。
但是,这仅在尝试块内适用。
--DECLARE @DivideByZero Int = 1/0--Uncommenting this will Skip everything below.
RAISERROR (N'Before Try: Raise-Error 16.', 16, 0)--Works.
SELECT 'Before Try: Select.'[Marker]--Works.
BEGIN TRY
RAISERROR (N'Inside Try: Raise-Error 16.', 16, 0)--Not displayed,but sends to Catch-Block.
SELECT 'Inside Try: Select.'[Marker]--Skipped.
END TRY
BEGIN CATCH
RAISERROR (N'Inside Catch: Raise-Error 16.', 16, 0)--Works.
SELECT 'Inside Catch: Select.'[Marker]--Works.
--RETURN --Adding Return will only skip what is After the Catch-Block for this scope only.
--;THROW--Shows the RAISERROR() from the Try-Block and Halts Execution. Must include ";".
END CATCH
RAISERROR (N'After Try-Catch: Raise-Error 16.', 16, 0)--Works.
SELECT 'After Try-Catch: Select.'[Marker]--Works.
Run Code Online (Sandbox Code Playgroud)
惊讶吗
我也是如此。引发我困扰的并不是所有Severity- 16都是一样的。
如果您不想在最顶部注释掉Divide-By-Zero线,那么下面的任何东西都不会运行。
Divide-By-Zero逻辑也将生成Severity- 16异常,
但它用句号来处理,这与用抛出时不同RAISERROR()
。
注:使用;THROW
作为最后你钓到的鱼,阻止内线正确
抛出SQL异常为RAISERROR()
你的尝试,阻止触发事件。
这将有效地停止执行。
如果;
在调用之前在捕获块中存在其他行,则需要使用分号;THROW
。
如果您的逻辑正确处理了Catch-Block中的错误(并且您想继续处理
其余的逻辑),请不要使用;THROW
。
不要将SQL-Server-Engine抛出的Severity- 16
与您使用引发的Severity- 16混淆RAISERROR()
。
对于所有意图和目的(故意抛出自己的错误),仅考虑2个严重性:
0(针对信息性或警告)和
16(针对在Try-Block中处理的异常-将其踢出Catch-Block) 。
注意:如果RAISERROR()
用于显示参考消息,
则建议使用WITH NOWAIT
:
RAISERROR('Read me right now!', 0, 1) WITH NOWAIT
RAISERROR('Read me whenever.' , 0, 1)
DECLARE @WaitSeconds Int = 10
DECLARE @WaitFor DateTime = DATEADD(SECOND, @WaitSeconds, 0)
WAITFOR DELAY @WaitFor
Run Code Online (Sandbox Code Playgroud)
当您希望了解
在整个批次中达到某些里程碑标记时事情进展的情况时,这在长时间批次操作中特别有用。
通过不使用WITH NOWAIT
,您可能永远不知道信息性消息何时出现。
它们可能在整个批处理过程中间歇出现,或者在批处理完成时一次全部出现。
归档时间: |
|
查看次数: |
52461 次 |
最近记录: |