RAISERROR (Transact-SQL)

来源:

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用awk取passwd10-20行然后重定向

1、先找到要做实验的文件cp。 cp /etc/passwd /tmp/xusx 2、使用awk取passwd10-20的第三列从定向输出test.txt 第一步 awk NR>10 && NR<20 /tmp/xusx/passwd >>/tmp/xusx/test.txt 第二步 rootlocalhost xusx]# awk NR>10 && NR<20 /tmp/x…

jsp mysql做登入界面_用jsp实现网站登录界面的制作,并连接数据库

这里介绍一下怎样连接数据库&#xff0c;并用jsp制作一个简单的登录界面1.首先需要搭建好环境&#xff0c;有Tomcat&#xff0c;eslipse,jdk等&#xff0c;并配置好环境变量&#xff0c;并安装好数据库&#xff0c;这里我使用的数据库是mysql数据库&#xff0c;并下载了一个MyS…

decimal 和 numeric (Transact-SQL)

带固定精度和小数位数的数值数据类型。 decimal[ (p[ , s] )] 和 numeric[ (p[ , s] )] 固定精度和小数位数。使用最大精度时&#xff0c;有效值从 - 10^38 1 到 10^38 - 1。decimal 的 SQL-92 同义词为 dec 和 dec(p, s)。numeric 在功能上等价于 decimal。p&#xff08;精度…

java流的应用_Java中I/O流的应用

Java中I/O流的应用iLeGeNDpackagecom.hp.io;/** I/O流的应用 * 实现目标&#xff1a; * 首先创建一个文件 * 通过键盘向文件添加内容 * 然后把文件的内容打印到控制台 * */import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import ja…

PHP的反射类ReflectionClass、ReflectionMethod使用实例

PHP5 具有完整的反射API&#xff0c;添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么&#xff1f; 它是指在PHP运行状态中&#xff0c;扩展分析PHP程序&#xff0c;导出或提取出关于类、方法、属性、参数等的详细信息&#xff0c;包括注释。这种动态获取的信…

java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...

多线程的实现方式&#xff1a;demo1、demo2demo1&#xff1a;继承Thread类&#xff0c;重写run()方法packagethread_test;public class ThreadDemo1 extendsThread {ThreadDemo1(){}ThreadDemo1(String szName){super(szName);}//重载run函数public voidrun() {for(int count …

word2007鼠标不好用

因为我装了 Powerdesigner 12.5&#xff0c;这个 COM 插件和 Word 2007 有冲突&#xff0c;所以导致了上面的问题&#xff0c;只要在 Word 移除这个 Addin 就可以了&#xff1a;左上角office图标——office选项——加载项——管理加载项——转到——去掉Powerdesigner Add-In前…

Axure5.1不能输入中文问题.

不能输入中文问题默认输入法改成“英语&#xff08;美国&#xff09;——美式键盘”。然后再进行切换就可以了。

java 静态线程_Java线程类静态本机void yield()方法(带示例)

线程类静态本机无效 yield()软件包java.lang.Thread.yield()中提供了此方法。yield()方法表示停止当前正在执行的线程&#xff0c;并为其他优先级相同的等待线程提供机会。如果没有等待线程&#xff0c;或者所有等待线程的优先级都较低&#xff0c;则同一线程将继续执行。这种方…

学习资料(不定更新)

w3cschool : http://www.w3school.com.cn/h.asp 菜鸟教程&#xff1a;http://www.runoob.com/ 51CTO: http://www.51cto.com/ angularjs: https://angularjs.org/ Python学习大本营: http://www.pythondoc.com/ http://webpy.org/ 比较好用的图表JS框架&#xff1a; http://www…

PowerDesigner物理数据模型

物理数据模型 name 显示名称code 生成代码中的名称comment 生成代码中备注生成代码中特例&#xff1a;外键名在Integrity——Constraint name主键名Constraint name

struts2-19-合法用户上传文件

一&#xff1a;登录页面 成功&#xff1a;--->upload.jsp 失败&#xff1a;返回错误信息&#xff08;用户名或者密码错误&#xff09; 二&#xff1a;上传文件 登录成功&#xff1a;上传成功 未登录&#xff1a;--->login.jsp错误信息&#xff08;请登录&#xff09; 三…

java 多线程生产者_java-Runnable加锁实现生产者和消费者的多线程问题

//库存函数&#xff0c;保存着库存的信息Storage.javapublic classStorage {//模拟库存public Integer num1;}//生产者函数 product.java/************************************************************Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.FileName: Customer.j…

Axure共享问题

获取共享项目 文件——获取共享项目——\\192.168.0.212\axureshare\HZ下一步——选择本地保存路径 签入签出 A签出——修改——签入——B获新就能看到新的了A签出的时候B不能更改 当A签出时&#xff0c;B无法查看动态面板的每个状态此时可以把面板复制到自己的页面看 修改中可…

maven项目和普通项目转换

转载于:https://www.cnblogs.com/yver/p/6054131.html

.java文件_【转】java文件操作大全

一.获得控制台用户输入的信息public String getInputMessage() throws IOException...{System.out.println("请输入您的命令∶");byte buffer[]new byte[1024];int countSystem.in.read(buffer);char[] chnew char[count-2];//最后两位为结束符&#xff0c;删去不要f…

T-SQL 字符串前加 N 是什么意思

比如 select status Nstopped 那么其中的字符串 stopped 前面为什么要加 N 呢&#xff1f;而且我们发现有些地方加 N 与否都没有影响&#xff0c;有些地方又必须加 N。 N 在这里表示 Unicode&#xff0c;就是双字节字符。对于西文字符&#xff0c;用一个字节来存储过足够了&am…

Gradle用户指南(1)-Gradle安装

前置条件 Gradle 需要 Java JDK 或者 JRE&#xff0c;版本是 6 及以上。Gradle 将会装载自己的 Groovy 库&#xff0c;因此&#xff0c;Groovy 不需要被安装。任何存在的 Groovy 安装都会被 Gradle 忽略。 Gradle 使用你 path 中的 JDK,或者&#xff0c;您可以设置 java_home 环…

幻读Java_脏读、幻读、不可重复读和丢失更新

1.脏读 -- 一个事务读取到另外一个事务没有提交的数据事务T1&#xff1a;更新一条数据-->事务T2&#xff1a;读取事务T1更新的记录事务T1&#xff1a;调用commit进行提交此时事务T2读取到的数据是保存在数据库内存中的数据&#xff0c;称为脏数据&#xff0c;这个过程称为脏…