MSSQL RAISERROR

本文详细介绍了SQL中的错误处理机制,特别是RAISERROR的用法及其与TRY...CATCH构造的交互。RAISERROR可以生成用户定义的错误消息,其严重级别影响控制是否转至CATCH块。当严重级别在11至20之间时,错误会在TRY块内引发CATCH。此外,还对比了RAISERROR与THROW的区别,包括严重性设定、日志记录及参数处理等方面。
摘要由CSDN通过智能技术生成

生成错误消息并启动会话的错误处理。 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 语句之间的一些差异。

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,则会回滚事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lypingfan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值