首页 > 数据库 >(转)SQL 抛出异常错误信息- RAISERROR (存储过程)

(转)SQL 抛出异常错误信息- RAISERROR (存储过程)

时间:2023-12-15 16:25:30浏览次数:29  
标签:10 -- text 错误信息 argument RAISERROR SQL msg

 

https://www.cnblogs.com/guorongtao/p/13896823.html

 

 

SQL 抛出异常错误信息- RAISERROR  (存储过程)

1、描述:生成错误消息并启动会话的错误处理。RAISERROR可以引用存储在系统消息目录视图或动态生成消息。该消息将作为服务器错误消息返回到调用应用程序或TRY…CATCH构造的关联CATCH块。新应用程序应该改用THROW。

2、作用: raiserror 是用于抛出一个错误。

3、语法:

1 2 3 4 5 RAISERROR ( { msg_id | msg_str | @local_variable }                    { ,severity ,state }                    [ ,argument [ ,...n ] ]           )          WITH option [ ,...n ] ]

4、参数说明:

参数1:{ msg_id | msg_str | @local_variable }

      msg_id:表示可以是一个sys.messages表中定义的消息代号;

              使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。

              用户定义错误消息的错误号应当大于 50000。

     msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符;

             (如果是常量,请使用N'xxxx',因为是nvarchar的)

              当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。

     @local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量。     

参数2:severity

            用户定义的与该消息关联的严重级别。(这个很重要)

            任何用户都可以指定 0 到 18 之间的严重级别。

            [0,10]的闭区间内,不会跳到catch;

            如果是[11,19],则跳到catch;

            如果[20,无穷),则直接终止数据库连接;

参数3:state

            如果在多个位置引发相同的用户定义错误,

            则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。

            介于 1 至 127 之间的任意整数。(state 默认值为1)

            当state 值为 0 或大于 127 时会生成错误!

参数4:argument

            用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。

参数5:option

            错误的自定义选项,可以是下表中的任一值:

            LOG :在错误日志和应用程序日志中记录错误;

            NOWAIT:将消息立即发送给客户端;

            SETERROR:将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000;

 

 

5、SQL代码示例

5.1 

1 2 3 DECLARE @raiseErrorCode nvarchar(50) SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY) RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)

5.2

1 2 3 4 5 6 7 8 9 RAISERROR (              N'This is message %s %d.'-- Message text,              10,                        -- Severity,              1,                         -- State,              N'number',                 -- First argument.              5                          -- Second argument.           ); -- The message text returned is: This is message number 5. GO

5.3

1 2 3 4 5 6 7 8 RAISERROR (N'<<%*.*s>>'-- Message text.            10,           -- Severity,            1,            -- State,            7,            -- First argument used for width.            3,            -- Second argument used for precision.            N'abcde');    -- Third argument supplies the string. -- The message text returned is: <<    abc>>. GO

5.4

1 2 3 4 5 6 RAISERROR (N'<<%7.3s>>'-- Message text.            10,           -- Severity,            1,            -- State,            N'abcde');    -- First argument supplies the string. -- The message text returned is: <<    abc>>. GO

5.5   从 CATCH 块返回错误消息

以下代码示例显示如何在 TRY 块中使用 RAISERROR 使执行跳至关联的 CATCH 块中。

它还显示如何使用 RAISERROR 返回有关调用 CATCH 块的错误的信息。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 BEGIN TRY     RAISERROR ('Error raised in TRY block.'-- Message text.                 16, -- Severity.                 -- State.                ); END TRY BEGIN CATCH     DECLARE @ErrorMessage NVARCHAR(4000);     DECLARE @ErrorSeverity INT;     DECLARE @ErrorState INT;       SELECT         @ErrorMessage = ERROR_MESSAGE(),         @ErrorSeverity = ERROR_SEVERITY(),         @ErrorState = ERROR_STATE();         RAISERROR (@ErrorMessage,  -- Message text.                @ErrorSeverity, -- Severity.                @ErrorState     -- State.                ); END CATCH;

5.6 在 sys.messages 中创建即席消息

以下示例显示如何引发 sys.messages 目录视图中存储的消息。

该消息通过 sp_addmessage 系统存储过程,以消息号50005添加到 sys.messages 目录视图中。

1 2 3 4 5 6 7 8 9 10 11 12 sp_addmessage @msgnum = 50005,                @severity = 10,                @msgtext = N'<<%7.3s>>'; GO RAISERROR (50005, -- Message id.            10,    -- Severity,            1,     -- State,            N'abcde'); -- First argument supplies the string. -- The message text returned is: <<    abc>>. GO sp_dropmessage @msgnum = 50005; GO

5.7 使用局部变量提供消息文本

以下代码示例显示如何使用局部变量为 RAISERROR 语句提供消息文本。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sp_addmessage @msgnum = 50005,               @severity = 10,               @msgtext = N'<<%7.3s>>'; GO   RAISERROR (50005, -- Message id.            10,    -- Severity,            1,     -- State,            N'abcde'); -- First argument supplies the string. -- The message text returned is: <<    abc>>. GO   sp_dropmessage @msgnum = 50005;   GO

  

 

标签:10,--,text,错误信息,argument,RAISERROR,SQL,msg
From: https://www.cnblogs.com/stableboy/p/17903586.html

相关文章

  • Win11无法启动SqlServer服务问题,SqlServer服务启动1067错误
    因为SQLServer当前支持512字节和4KB的扇区存储大小。所以需要将SqlServer安装到支持4KB的磁盘。以管理员权限运行PowerShell,执行fsutilfsinfosectorinfoC:命令查看各磁盘是否支持4kb存储查找以下字段值(单位为字节)PhysicalBytesPerSectorForAtomicityPhysicalBytesPe......
  • IntelliJ IDEA无公网远程连接Windows本地Mysql(开发调试必备,提高开发效率!!!)
    IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如mysql数据库,但是在IDEA中只能连接本地数据库,有时候需要访问其他地方如家里或者公司的数据库,将无法访问,内网的局限性导致我们只能在同一网络访问,无法跨网络访问,所以,本例将介绍如何在异地也可以实现远程连接......
  • MySQL往数据库插时间格式的数据时,只保存年月日,不保存时分秒。
     MySQL往数据库插时间格式的数据时,只保存年月日,不保存时分秒。今天在写项目时候,需要将数据insert到数据库中。但是,看到插入数据库中的时间只有年月日,没有时分秒。 查看实体类没毛病 查看xml文件也没有问题  timestamp和datetime区别: 最后经过排查发现问题......
  • mysql主从切换
    需求:停止db03机器上的主库,将db05从节点作为主库,将其他从库的主库指向db05前置准备,打通业务机器和db05的防火墙,保证db03db05mysql实例上的账户信息一致1、让业务停止写入db03上的mysql主库2、登录mysqldb03查看位点showmasterstatus;+------------------+......
  • python连接pgsql&mysql
    1、python连接pgsqlimportpsycopg2defconnect_pgsql(list_sql):conn=psycopg2.connect(host='db_host',user='db_user',password='db_passwd',......
  • mysql OCP 8.0 33题
    Choosethebestanswer.YouhaveaMySQLsystemwith500GBofdatathatneedsfrequentbackups.您有一个具有500GB数据的MySQL系统,需要频繁备份YouuseamixofMyISAMandInnoDBstorageenginesforyourdata.您可以混合使用MyISAM和InnoDB存储引擎来进行数据处理......
  • SQL自动化注ru-SQLmap入门操作(一)
    了解SQLmap基础操作SQLmap是一款自动化的SQL注入工具,可以用于检测和利用SQL注入漏洞。以下是SQLmap的入门操作步骤:下载SQLmap:可以从官方网站(https://sqlmap.org/)下载最新版本的SQLmap。打开终端:在终端中进入SQLmap所在的目录。输入命令:使用以下命令运行SQLmap:pythonsqlmap.py-u<......
  • FirebirdSql.Data.FirebirdClient.FbDataAdapter的bug吗
    在连接Firebird4数据库时,使用以下: FbDataAdapterda=newFbDataAdapter(sql,this.cnstring); DataTabledt=newDataTable(); da.Fill(dt); returndt;在一直的相像中,FbDataAdapter在接收到连接字符串时,会自动创建一个Connection并Open使用,用完再Close,即不需......
  • Mysql慢日志getshell
    Mysql慢日志getshellshowvariableslike'%slow%';Variable_nameValuelog_slow_queriesOFFslow_launch_time2slow_query_logOFFslow_query_log_fileC:\phpStudy\PHPTutorial\MySQL\data\WIN-374NAWYudt-slow.logsetGLOBALsl......
  • SQL注入攻击的原理以及如何防止SQL注入(简易)
    ......