SQL Server之print和raiserror语句介绍

0    377    1

Tags:

👉 本文共约12905个字,系统预计阅读时间或需49分钟。

This article explores the SQL Server PRINT statements, and its alternative SQL Server RAISEERROR statements to print messages in a query.

本文探讨了SQL Server PRINT语句及其替代SQL Server RAISEERROR语句,以打印查询中的消息。

参考

https://docs.microsoft.com/zh-cn/sql/t-sql/language-elements/raiserror-transact-sql?view=sql-server-ver15

https://docs.microsoft.com/zh-cn/sql/t-sql/language-elements/print-transact-sql?view=sql-server-ver15

RAISERROR (Transact-SQL)官方

RAISERROR 语句不遵循 SET XACT_ABORT 。 新应用程序应使用 THROW 而不是 RAISERROR 。

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

SQL Server之print和raiserror语句介绍Transact-SQL 语法约定

语法

备注

若要查看 SQL Server 2014 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

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 会引发一个错误号为 50000 的错误消息。

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 中指定的长度。

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

精度

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

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

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

{h | l} type

与字符类型 d、i、o、s、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 中使用的类型规范。 例如,Transact-SQL 没有指针数据类型,因此 RAISERROR 不支持用于指针的 %p 规范。

备注

要将值转换为 Transact-SQL bigint 数据类型,请指定 %I64d 。

local_variable@
是一个可以为任何有效字符数据类型的变量,其中包含的字符串的格式化方式与 msg_str 相同 。 @local_variable 必须为 char 或 varchar,或者能够隐式转换为这些数据类型。

severity
是与此消息关联的用户定义的严重性级别。 使用 msg_id 引发使用 sp_addmessage 创建的用户定义消息时,RAISERROR 上指定的严重性会替代 sp_addmessage 中指定的严重性。
若要使用 19 到 25 之间的严重级别,必须选择 WITH LOG 选项。 将小于 0 的严重级别解释为 0。 将大于 25 的严重级别解释为 25。

注意

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

可以指定“-1”来返回与以下示例中所示的错误关联的严重性值。

SQL复制

下面是结果集:

复制

State
0 到 255 之间的整数。 负值默认为 1。 不应使用大于 255 的值。

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

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。 适用于: SQL Server, SQL 数据库
NOWAIT将消息立即发送给客户端。 适用于: SQL Server, SQL 数据库
SETERROR将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000,不用考虑严重级别。 适用于: SQL Server, SQL 数据库

备注

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。

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.

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
SQL Server之print和raiserror语句介绍后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部