• MSSQL RAISERROR


    生成错误消息并启动会话的错误处理。 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:参照事实自行扩充即可。

    1. RAISERROR (N'This is message %s %d,%s.', -- Message text.
    2. 16, -- Severity,
    3. 1, -- State,
    4. N'number', -- First argument.
    5. 5,
    6. ' 我的测试'); -- Second argument.
    7. -- The message text returned is: This is message number 5.
    8. GO
    9. 结果:
    10. 消息 50000,级别 16,状态 1,第 10
    11. This is message number 5, 我的测试.
    12. 完成时间: 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,则会回滚事务。
  • 相关阅读:
    MySQL、Oracle、SQL Server / MS Access 中的 NULL函数用法
    【SpringBoot实战】实现WEB的常用功能
    2022-10-27 C++并发编程( 三十八 )
    如何在智能合约中调用另一个合约的函数
    element的表单校验正常手机号码以及输入框填写“不详”的情况
    Sqoop(二):Hive导出数据到Oracle
    13.Oracle通过JDBC连接Java
    介绍适用于 Node.js 的 Elastic OpenTelemetry 发行版
    ES6.--Promise、任务队列和事件循环
    智能AI系统源码ChatGPT系统源码+详细搭建部署教程+AI绘画系统+已支持OpenAI GPT全模型+国内AI全模型
  • 原文地址:https://blog.csdn.net/lypingfan/article/details/125414787