来源:

SQL Server 2005 联机丛书

生成错误消息并启动会话的错误处理。RAISERROR 可以引用 sys.messages 目录视图中存储的用户定义消息,也可以动态建立消息。该消息作为服务器错误消息返回到调用应用程序,或返回到 TRY…CATCH 构造的关联 CATCH 块。

语法

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

备注
<?XML:NAMESPACE PREFIX = [default] http://ddue.schemas.microsoft.com/authoring/2003/5 NS = "http://ddue.schemas.microsoft.com/authoring/2003/5" />

RAISERROR 生成的错误与数据库引擎 代码生成的错误的运行方式相同。RAISERROR 指定的值由 ERROR_LINE、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、ERROR_STATE 以及 @@ERROR 等系统函数来报告。当 RAISERROR 在严重级别为 11 或更高的情况下在 TRY 块中运行,它便会将控制传输至关联的 CATCH 块。如果 RAISERROR 在下列情况下运行,便会将错误返回到调用方:

在任何 TRY 块的作用域之外运行。
在严重级别为 10 或更低的情况下在 TRY 块中运行。
在严重级别为 20 或更高的情况下终止数据库连接。

CATCH 块可以使用 RAISERROR 来再次引发调用 CATCH 块的错误,方法是使用 ERROR_NUMBER 和 ERROR_MESSAGE 之类的系统函数检索原始错误消息。对于严重级别为 1 到 10 的消息,@@ERROR 默认值为 0。有关详细信息,请参阅在 Transact-SQL 中使用 TRY...CATCH。

当 msg_id 指定 sys.messages 目录视图中可用的用户定义消息时,RAISERROR 按照与应用到使用 msg_str 指定的用户定义消息文本的规则相同的规则处理文本列中的消息。用户定义消息文本可以包含转换规格,并且 RAISERROR 将参数值映射到转换规格。使用 sp_addmessage 添加用户定义错误消息,而使用 sp_dropmessage 删除用户定义错误消息。

RAISERROR 可以替代 PRINT 将消息返回到调用应用程序。RAISERROR 支持类似于 C 标准库中 printf 函数功能的字符替代,而 Transact-SQL PRINT 语句则不支持。PRINT 语句不受 TRY 块的影响,而在严重级别为 11 到 19 的情况下在 TRY 块中运行的 RAISERROR 会将控制传输至关联的 CATCH 块。指定严重级别为 10 或更低以使用 RAISERROR 返回 TRY 块中的消息,而不必调用 CATCH 块。

通常,连续的参数替换连续的转换规格;第一个参数替换第一个转换规格,第二个参数替换第二个转换规格,以此类推。例如,在以下 RAISERROR 语句中,第一个参数
N'number'
代替第一个转换规格 %s,,第二个参数 5 代替第二个转换规格 %d。

复制代码
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

如果为转换规格的宽度或精度指定了星号 (*),则要用于宽度或精度的值被指定为整数参数值。在这种情况下,一个转换规格最多可以使用三个参数,分别用作宽度、精度和替代值。

例如,下列两个 RAISERROR 语句都返回相同的字符串。一个指定参数列表中的宽度值和精度值;另一个指定转换规格中的宽度值和精度值:

复制代码
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
RAISERROR (N'<<%7.3s>>', -- Message text.10, -- Severity,1, -- State,N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO

参数

msg_id

使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。用户定义错误消息的错误号应当大于 50000。如果未指定 msg_id,则 RAISERROR 引发一个错误号为 50000 的错误消息。

msg_str

用户定义消息,格式与 C 标准库中的 printf 函数类似。该错误消息最长可以有 2,047 个字符。如果该消息包含的字符数等于或超过 2,048 个,则只能显示前 2,044 个并添加一个省略号以表示该消息已被截断。请注意,由于内部存储行为的缘故,替代参数使用的字符数比输出所显示的字符数要多。例如,赋值为 2 的代替参数 %d 实际在消息字符串中生成一个字符,但是还会在内部占用另外三个存储字符串。此存储要求减少了可用于消息输出的字符数。

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

msg_str 是一个字符串,具有可选的嵌入转换规格。每个转换规格都会定义参数列表中的值如何格式化并将其置于 msg_str 中转换规格位置上的字段中。转换规格的格式如下:

% [[flag] [width] [. precision] [{h | l}]] type

可在 msg_str 中使用的参数包括:

flag

用于确定被替换值的间距和对齐的代码。

代码 前缀或对齐 说明

-(减号)

左对齐

在给定字段宽度内左对齐参数值。

+(加号)

符号前缀

如果参数值为有符号类型,则在参数值的前面加上加号(+)或减号(-)。

0(零)

零填充

在达到最小宽度之前在输出前面加上零。如果出现 0 和减号 (-),将忽略 0。

#(数字)

对 x 或 X 的十六进制类型使用 0x 前缀

当使用 o、x 或 X 格式时,数字符号 (#) 标志在任何非零值的前面分别加上 0、0x 或 0X。当 d、i 或 u 的前面有数字符号 (#) 标志时,将忽略该标志。

' '(空格)

空格填充

如果输出值有符号且为正,则在该值前加空格。如果包含在加号(+)标志中,则忽略该标志。

width

定义放置参数值的字段的最小宽度的整数。如果参数值的长度等于或大于 width,则打印该值,无需进行填充。如果该值小于 width,则将该值填充到 width 中指定的长度。

星号 (*) 表示宽度由参数列表中的相关参数指定,该宽度必须为整数值。

precision

从字符串值的参数值中得到的最大字符数。例如,如果一个字符串具有五个字符并且精度为 3,则只使用字符串值的前三个字符。

对于整数值,precision 是指打印的最小位数。

星号 (*) 表示精度由参数列表中的相关参数指定,该精度必须为整数值。

{h | l} type

与字符类型 d、i、o、x、X 或 u 一起使用,用于创建 shortint (h) 值或 longint (l) 值。

类型规范 表示

d 或 i

有符号整数

o

无符号八进制数

s

字符串

u

无符号整数

x 或 X

无符号十六进制数

请注意 这些类型规范基于最初为 C 标准库中 printf 函数定义的规范。RAISERROR 消息字符串中使用的类型规范映射到 Transact-SQL 数据类型,而 printf 中使用的规范映射到 C 语言数据类型。当 Transact-SQL 不具有与关联 C 数据类型类似的数据类型时,RAISERROR 不支持 printf 中使用的类型规范。例如,RAISERROR 不支持用于指针的 %p 规范,因为 Transact-SQL 不具有指针数据类型。

@local_variable

表示包含按照 msg_str 的方式格式化的字符串的任何有效字符串数据类型的变量。@local_variable 的数据类型必须为 char 或 varchar,或者必须能够隐式转换为这些数据类型。

severity

用户定义的与该消息关联的严重级别。当使用 msg_id 引发使用 sp_addmessage 创建的用户定义消息时,RAISERROR 上指定的严重性将覆盖 sp_addmessage 中指定的严重性。

任何用户都可以指定 0 到 18 之间的严重级别。只有 sysadmin 固定服务器角色成员或具有 ALTER TRACE 权限的用户才能指定 19 到 25 之间的严重级别。若要使用 19 到 25 之间的严重级别,必须选择 WITH LOG 选项。

注意:
20 到 25 之间的严重级别被认为是致命的。如果遇到致命的严重级别,客户端连接将在收到消息后终止,并将错误记录到错误日志和应用程序日志。
注意:
小于 0 的严重级别被解释为级别为 0。大于 25 的严重级别被解释为级别为 25。
state

介于 1 至 127 之间的任意整数。state 的负值默认为 1。值为 0 或大于 127 会生成错误。

如果在多个位置引发相同的用户定义错误,则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。

argument

用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。可以有 0 个或多个替代参数,但是替代参数的总数不能超过 20 个。每个代替参数都可以是局部变量或具有下列任一数据类型:tinyint、smallint、int、char、varchar、nchar、nvarchar、binary 或 varbinary。不支持其他数据类型。

option

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

说明

LOG

在 Microsoft SQL Server 数据库引擎 实例的错误日志和应用程序日志中记录错误。记录到错误日志的错误目前被限定为最多 440 字节。只有 sysadmin 固定服务器角色成员或具有 ALTER TRACE 权限的用户才能指定 WITH LOG。

NOWAIT

将消息立即发送给客户端。

SETERROR

将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000,不用考虑严重级别。

示例

A. 从 CATCH 块返回错误消息

下面的代码示例显示如何在 TRY 块中使用 RAISERROR 使执行跳至关联的 CATCH 块中。它还显示如何使用 RAISERROR 返回有关调用 CATCH 块的错误的信息。

复制代码
BEGIN TRY-- RAISERROR with severity 11-19 will cause exeuction to -- jump to the CATCH block.RAISERROR ('Error raised in TRY block.', -- Message text.16, -- Severity.1 -- State.);
END TRY
BEGIN CATCHDECLARE @ErrorMessage NVARCHAR(4000);DECLARE @ErrorSeverity INT;DECLARE @ErrorState INT;SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE();-- Use RAISERROR inside the CATCH block to return error-- information about the original error that caused-- execution to jump to the CATCH block.RAISERROR (@ErrorMessage, -- Message text.@ErrorSeverity, -- Severity.@ErrorState -- State.);
END CATCH;

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

以下代码示例显示如何引发 sys.messages 目录视图中存储的消息。该消息通过 sp_addmessage 系统存储过程,以消息号 50005 被添加到 sys.messages 目录视图中。

复制代码
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

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

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

复制代码
DECLARE @StringVariable NVARCHAR(50);
SET @StringVariable = N'<<%7.3s>>';RAISERROR (@StringVariable, -- Message text.10, -- Severity,1, -- State,N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO

RAISERROR (Transact-SQL)相关推荐

  1. 交互式SQL(Transact SQL,TSQL)

    交互式SQL(Transact SQL,TSQL) 它是SQL Server的查询语言.提供以下命令: · 创建和数据库对象. · 访问和修改数据. · 数据聚合(aggregation,又称聚集). ...

  2. Transact SQL 常用语句以及函数

    Transact SQL  语 句 功 能  ======================================================================== --数据 ...

  3. transact sql

    结构化查询语言是美国国家标准协会和国际标准化组织定义的标准,而transact sql是microsoft公司对此标准的一个实现 它可以创建,维护,保护数据对象,并且可以操作对象中的数据,所以tran ...

  4. Transact SQL 语 句

    Transact SQL   语 句 功 能  ======================================================================== -- ...

  5. SQL Server中的几个方法和Transact SQL 常用语句以及函数[个人推荐]

    --数据操作   SELECT --从数据库表中检索数据行和列  INSERT --向数据库表添加新数据行  DELETE --从数据库表中删除数据行  UPDATE --更新数据库表中的数据  -- ...

  6. transact sql mysql_Sql Server数据库常用Transact-SQL脚本(推荐)

    Transact-SQL Transact-SQL(又称 T-SQL),是在 Microsoft SQL Server 和 Sybase SQL Server 上的 ANSI SQL 实现,与 Ora ...

  7. transact sql mysql_MySQL与Transact SQL(MS SQL Server)的SQL语句区别点滴(C++)

    最近在写一个数据访问层,要求可以使用MySQL和MS SQL Server.html 烦劳今后开始,MySQL与MS SQL Server的大量不一致让人烦不胜烦,为了使其余人再也不犯本身工做过程当中 ...

  8. Transact -SQL 语句

    Transact- SQL 概述 了解 SQL 结构化查询语言 Transact-SQL 语言是 SQL 的增强版本 种类 数据 定义 操纵 控制 常用 事务管理 流程控制 附加的语言元素 常量与变量 ...

  9. Transact SQL教程(一)

    在下面部分的许多语句都不是SQL标准语句,而是一个叫做Transact-SQL(T-SQL)的SQL扩展的一部分.T-SQL通过在别的事物上添加一些诸如变量.条件和循环之类的传统编程元素来扩充SQL. ...

  10. sql raiserror_SQL Server PRINT和SQL Server RAISERROR语句

    sql raiserror This article explores the SQL Server PRINT statements, and its alternative SQL Server ...

最新文章

  1. Python Django 获取多条记录API
  2. webpack 4.0 配置文件 webpack.config.js文件的放置位置
  3. 项目中cxf和weblogic整合时报错的问题
  4. 科创板注册获批,优刻得将成为“公有云第一股”
  5. 微机原理和计算机组成原理一样吗_计算机组成原理:计算机的层次与编程语言...
  6. 05-sqlyog的安装与基本使用
  7. springboot面试
  8. 我的第一个keil工具写的汇编
  9. 人工智能导论(专家系统)
  10. 使用VirtualBox创建Mac虚拟机
  11. “打工女皇帝”吴士宏-永远先走一步
  12. 天线要设计为四分之一波长的原因
  13. 3、线性表的顺序存储结构(顺序表)
  14. android发送短信的两种方式,发送长短信的两种方式,群发短信
  15. Android应用优化指南
  16. 待业一年多,我终于找到工作啦,月薪1.5万,双休不加班
  17. PLSQL Oracle存储过程(实例分析)
  18. D-CAP模式和DCS-control模式
  19. 数据驱动的基本原理是什么?
  20. 基于STM32的智能泊车系统

热门文章

  1. 前端学习(2658):vue3优化
  2. 前端学习(1939)vue之电商管理系统电商系统之完成全部功能
  3. 前端学习(1886)vue之电商管理系统电商系统之首页路由的重定向主页侧边栏路由链接的改造
  4. 前端学习(653):算数运算符
  5. 计算机操作系统(1):OS的作用和目标
  6. java学习(32):巩固练习
  7. java学习(14):java命名规范
  8. 实例31:python
  9. rpm包安装mysql数据库
  10. python 数据模型