RAISERROR用法

article/2025/8/26 5:12:03

来源http://msdn.microsoft.com/zh-cn/library/ms177497.aspx

RAISERROR 用于将与 SQL Server 数据库引擎生成的系统错误或警告消息使用相同格式的消息返回到应用程序中。

RAISERROR 还可以返回:

  • 已通过 sp_addmessage 系统存储过程创建的用户定义的错误消息。这些消息的消息号大于 50000;可在 sys.messages 目录视图中查看这些消息。
  • 在 RAISERROR 语句中指定的消息字符串。

RAISERROR 还可以:

  • 分配特定的错误号、严重度和状态。
  • 请求将错误记录到数据库引擎错误日志和 Microsoft Windows 应用程序日志中。
  • 将参数值代入消息正文中,这与 C 语言中的 printf_s 函数非常相似。

RAISERROR 和 PRINT 都可以用来将信息性消息或警告消息返回到某个应用程序中。RAISERROR 返回的消息正文可以使用类似 C 标准库中的 printf_s 函数的字符串替换功能来生成,然而 PRINT 只能返回字符串或字符表达式。如果在 TRY...CATCH 构造的 TRY 块中执行的 RAISERROR 严重度介于 11 到 19 之间,会导致将控制传递到关联的 CATCH 块。如果指定 10 或更低的严重度,将使用 RAISERROR 返回消息,而不调用 CATCH 块。PRINT 不会将控制传输到 CATCH 块。

当 RAISERROR 在 sys.messages 中与用户定义消息的 msg_id 一起使用时,msg_id 作为 SQL Server 错误号或本机错误代码返回。而当 RAISERROR 用于 msg_str 而不是 msg_id 时,则返回的 SQL Server 错误号和本机错误号为 50000。

当使用 RAISERROR 返回用户定义的错误消息时,请在每个引用该错误的 RAISERROR 中使用不同的状态号码。这可以在发生错误时帮助进行错误诊断。

使用 RAISERROR 可以:

  • 帮助对 Transact-SQL 代码进行故障排除。
  • 检查数据值。
  • 返回包含变量文本的消息。
  • 导致执行从 TRY 块跳到关联的 CATCH 块。
  • 将错误信息从 CATCH 块返回到进行调用的批处理或应用程序。
RAISERROR (Transact-SQL)

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

主题链接图标 Transact-SQL 语法约定

RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
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 中指定的长度。

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

precision

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

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

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

{h | l} type

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

类型规范 表示

d 或 i

带符号的整数

o

无符号的八进制数

s

字符串

u

无符号的整数

x 或 X

无符号的十六进制数

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

ms178592.note(zh-cn,SQL.105).gif注意:
若要将值转换为 Transact-SQL bigint 数据类型,请指定 %I64d

@ local_variable

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

severity

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

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

ms178592.Caution(zh-cn,SQL.105).gif注意:
20 到 25 之间的严重级别被认为是致命的。如果遇到致命的严重级别,客户端连接将在收到消息后终止,并将错误记录到错误日志和应用程序日志。

ms178592.note(zh-cn,SQL.105).gif注意:
小于 0 的严重级别被解释为级别为 0。大于 25 的严重级别被解释为级别为 25。

state

0 到 255 的整数。负值或大于 255 的值会生成错误。

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

argument

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

option

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

说明

LOG

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

NOWAIT

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

SETERROR

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

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

A. 从 CATCH 块返回错误消息

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

ms178592.note(zh-cn,SQL.105).gif注意:
RAISERROR 仅生成其状态为 1 到 127 的错误。由于数据库引擎可能会引发状态为 0 的错误,因此建议您在将由 ERROR_STATE 返回的错误状态作为值传递给 RAISERROR 状态参数之前,先对错误状态进行检查。

复制代码
BEGIN TRY
-- RAISERROR with severity 11-19 will cause execution to 
-- jump to the CATCH block.
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- 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();
-- 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

http://chatgpt.dhexx.cn/article/LCV6EY8r.shtml

相关文章

SQL Server研习录(23)——RAISERROR()函数

SQL Server研习录&#xff08;23&#xff09;——RAISERROR函数 版权声明一、RAISERROR()函数1、基本语法 版权声明 本文原创作者&#xff1a;清风不渡博客地址&#xff1a;https://blog.csdn.net/WXKKang 一、RAISERROR()函数 概念&#xff1a;生成错误消息并启动会话的错误处…

秒懂SQL SERVERE 数据库中RAISERROR的基本用法

基本用法 raiserror(msg,severity,state)一、msg 错误信息。 二、severity 错误信息的级别&#xff0c;我们可以指定 0 到 18 之间的严重级别。 只有 sysadmin 固定服务器角色成员或具有 ALTER TRACE 权限的用户才能指定 19 到 25 之间的严重级别。若要使用 19 到 25 之间的严…

国产化DSP方案引领VoIP产业全面升级

国内VoIP产业已经是一个发展了20多年的成熟产业链。稳定的客户群体&#xff0c;十几年不变的进口DSP方案&#xff0c;大同小异的产品形态&#xff0c;近几年罕有创新产品诞生。2019年6月1日绅聚科技推出重磅产品–全国产DSP芯片解决方案–A1010&#xff0c;将引领VoIP产业进行全…

A1006

#include <stdio.h>struct pNode{char id[20];int hh,mm,ss; }ans1,ans2, temp;bool great(pNode node1, pNode node2){ //时间node1 大于node2 返回真if (node1.hh ! node2.hh) return node1.hh>node2.hh;if (node1.mm ! node2.mm) return node1.mm>node2.m…

A1010 Radix (25 分)PAT甲级真题(C++)【进制转换】题目详解 测试点分析

Given a pair of positive integers, for example, 6 and 110, can this equation 6 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N1​ and N2​, your task is to find the radix of on…

汇编踩过的坑(error A1010,A2085 ,divide error,A2070,注意事项)

汇编踩过的坑&#xff08;error A1010&#xff0c;A2085 &#xff0c;divide error&#xff0c;A2070&#xff0c;注意事项&#xff09; 最近也是在学汇编语言&#xff0c;上机的时候发现错误很不友好&#xff0c;总是断断续续&#xff0c;上网去查询&#xff0c;又查不到&…

【PAT甲级】A1001-A1050刷题记录

文章目录 A1001 AB Format (20 分) 0.25★(一元多项式加法) A1002 AB for Polynomials (25 分) 0.21(单源最短路Dijkstra边权第二标尺(点权)最短路数目) A1003 Emergency (25 分) 0.28(静态树层次遍历) A1004 Counting Leaves (30 分) 0.35A1005 Spell It Right (20 分) 0.34A1…

绅聚科技推出首款国产化VoIP专用芯片A1010

近20年来我国VoIP产业一直处于蓬勃发展之中&#xff0c;但是最核心的语音融合处理芯片&#xff08;DSP&#xff09;一直是被进口芯片方案所占据&#xff0c;VoIP产品全国产化一直无法实现。2019年6月1日绅聚科技推出了中国首家自主知识产权的中低密度语音融合处理芯片——A1010…

机房收费系统---详细设计说明书

详细设计说明书 1引言 1.1编写目的 说明编写这份详细设计说明书的目的&#xff0c;指出预期的读者。 该文档是在概要设计的基础上&#xff0c;进一步的细化系统结构&#xff0c;展示了软件结构的图表&#xff0c;物理设计&#xff0c;数据结构设计&#xff0c;以及算法设计…

概要设计说明书【校园BBS论坛-附源码】2022-5.5

信息系统分析与设计——系列文章 一、《软件项目开发计划【列文】2022.5.11》 二、《GB&#xff0d;软件需求说明书【列文】2022-5.6》 三、《需求分析文档——适用范围&#xff1a;产品规划经理进行需求分析》 四、《开发进度月报【列文】2022.5.11》 五、《可行性研究报告【列…

数据库课程设计 论坛系统—— 系统详细设计说明书

马马虎虎记录下2021Fall 的数据库课程设计——论坛系统 基于django开发&#xff0c;源码上传到github啦:) &#x1f517; B612Forum 不能翻墙的戳这里:) csdn资源下载 文章目录 1. 文档介绍1.1. 编写目的1.2. 文档范围1.3. 读者对象 2. 数据库概念结构设计2.1 系统 ER 图2.2 系…

【软件工程】机房文档--详细设计说明书

详细设计说明书 1引言 1.1编写目的 现在机房里提供的办公服务不断增加&#xff0c;信息不断的发展&#xff0c;单靠人工管理已经远远不能应付&#xff0c;这就要求办公自动化系统必须实现自动化、集成化。充分利用计算机网络优势&#xff0c;提高办公效率&#xff0c;是机房…

05详细设计说明书

详细设计说明书 1引言 1.1编写目的 本阶段在用户的需求分析的基础上&#xff0c;对机房收费系统做出概要设计。 编制的目的是说明对程序系统的设计考虑&#xff0c;包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计…

网约技师APP详细设计说明书

目录 1引言 3 1.1编写目的 3 1.2背景 3 1.3定义 3 1.4参考资料 4 2程序系统的结构 4 3登录程序Login()设计说明 5 3.1程序描述 5 3.2功能 6 3.3性能 6 3.4输人项 6 3.5输出项 7 3.6算法 7 3.7流程逻辑 7 3.8接口 8 3.9存储分配 8 3.10注释设计 8 3.11限制条件…

【综合实训】图书管理系统——详细设计说明书

【备注】本说明书由华中农业大学2018级计算机科学与技术专业的刘铠铭、崔凌浩、卢家伟三位同学共同完成。 文章目录 1 引言1.1 编写目的1.2 项目背景1.3 定义1.4 参考资料 2 总体设计2.1 需求概述2.2 软件结构 3 模块描述3.1 模块基本信息3.2 功能概述3.3 算法3.4 模块处理逻辑…

详细设计说明书(基于C语言的羽毛球场馆预订及查询系统)

详细设计说明书 目录 一.基本情况概述... 3 1.用户名 2. 基本说明 3. 背景 4.编写目的 5.主要参考资料 二&#xff0e;软件详解... 4 1.设计流程图 2.软件主要功能 3.软件各模块 三&#xff0e;测试分析... 5 1.限制条件 2.出现的问题 四&#xff0e;源代码解析.…

计算机基础(一)硬件

校园里当初学习的知识基本消耗殆尽&#xff0c;脑海中只剩浅浅又浅浅的记忆痕迹。即使一直从事相关的工作&#xff0c;但仅仅在一个方向上做着苦行僧&#xff0c;从来无暇去还原看全貌。或许是心有余悸&#xff0c;亦或许是仅仅为了搞钱而没用心正面看过它。在滚滚向前的科技时…

计算机基础硬件知识点讲解

目录 1.CPU2.内存2.1 随机存取存储器2.2 只读存储器 3.高速缓冲存储器3.寄存器6.磁盘7.I/O设备8.运行流程 1.CPU CPU是计算机的大脑&#xff0c;主要和内存进行交互&#xff0c;从内存中提取指令并执行它。在时间多路复用(Time Multiplexing) 的CPU中操作系统往往停止运行一个…

计算机硬件基础知识(三)

1 存储系统 存储系统在计算机系统中的地位非常重要 一般有 Cache和主存组成 Cache 由于在CPU和存储系统间存在数据传送带宽的限制&#xff0c;因此在其中设置了Cache&#xff08;高速缓冲存储器&#xff09; 提高效率&#xff0c;但是由于成本更高&#xff0c;所以cache的容量…

计算机硬件:内存条的基础知识笔记

在电脑硬件中&#xff0c;CPU、显卡、内存均三者是重中之重&#xff0c;所以我们在选择这些核心硬件一定要慎重。今天给大家分享一下关于的电脑内存基础知识&#xff0c;让更多的装机朋友们可以更好的学习内存相关知识。 史上最易懂的电脑内存基础知识 内存条的基本概念&#x…