生成错误消息并启动会话的错误处理。 RAISERROR 可以引用 sys.messages 目录视图中存储的用户定义消息,也可以动态建立消息。 该消息作为服务器错误消息返回到调用应用程序,或返回到 TRY…CATCH 构造的关联 CATCH 块。 新应用程序应改用 THROW。
RAISERROR 生成的错误与数据库引擎代码生成的错误的运行方式相同。 RAISERROR 指定的值由 ERROR_LINE、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、ERROR_STATE 以及 @@ERROR 等系统函数来报告。 当 RAISERROR 在严重级别为 11 或更高的情况下在 TRY 块中运行,它便会将控制传输至关联的 CATCH 块。 如果 RAISERROR 在下列情况下运行,便会将错误返回到调用方:
在任何 TRY 块的作用域之外运行。
在严重级别为 10 或更低的情况下在 TRY 块中运行。
在严重级别为 20 或更高的情况下终止数据库连接
总结:在使用TRY 块时,严重级别应该在11之上,不高于20,会将控制传输至关联的 CATCH 块.
RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } [ ,argument [ ,...n ] ] ) [ WITH option [ ,...n ] ]
severity:是与此消息关联的用户定义的严重性级别。 使用 msg_id 引发使用 sp_addmessage 创建的用户定义消息时,RAISERROR 上指定的严重性会替代 sp_addmessage 中指定的严重性。
若要使用 19 到 25 之间的严重级别,必须选择 WITH LOG 选项。 将小于 0 的严重级别解释为 0。 将大于 25 的严重级别解释为 25。
注意,这一点很关键,如果要记录日志,对应用程序的影响最大,用时要慎重。
20 到 25 之间的严重级别被认为是致命的。 如果遇到致命的严重级别,客户端连接将在收到消息后终止,并将错误记录到错误日志和应用程序日志。
State
0 到 255 之间的整数。 负值默认为 1。 不应使用大于 255 的值。
argument:参照事实自行扩充即可。
-
- RAISERROR (N'This is message %s %d,%s.', -- Message text.
- 16, -- Severity,
- 1, -- State,
- N'number', -- First argument.
- 5,
- ' 我的测试'); -- Second argument.
- -- The message text returned is: This is message number 5.
- GO
-
-
- 结果:
- 消息 50000,级别 16,状态 1,第 10 行
- This is message number 5, 我的测试.
-
- 完成时间: 2022-06-22T18:37:16.4665297+08:00
-
下表列出了 RAISERROR 和 THROW 语句之间的一些差异。
RAISERROR 语句 | THROW 语句 |
---|---|
如果将 msg_id 传递给 RAISERROR,则必须在 sys.messages 中定义 ID 。 | 无需在 sys.messages 中定义 error_number 参数 。 |
msg_str 参数可以包含 printf 格式设置样式 。 | message 参数不接受 printf 样式的格式设置 。 |
severity 参数指定异常的严重性 。 | 没有 severity 参数 。 当 THROW 被用来发起异常时,严重性始终设置为 16。 但是,当 THROW 用于重新引发一个现有异常时,严重性被设置为该异常的严重级别。 |
不遵循 SET XACT_ABORT。 | 如果 SET XACT_ABORT 为 ON,则会回滚事务。 |