RAISERROR详解.docx
- 文档编号:24350047
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:10
- 大小:22.07KB
RAISERROR详解.docx
《RAISERROR详解.docx》由会员分享,可在线阅读,更多相关《RAISERROR详解.docx(10页珍藏版)》请在冰豆网上搜索。
RAISERROR详解
RAISERROR详解
生成错误消息并启动会话的错误处理。
RAISERROR可以引用sys.messages目录视图中存储的用户定义消息,也可以动态建立消息。
该消息作为服务器错误消息返回到调用应用程序,或返回到TRY…CATCH构造的关联CATCH块。
语法
RAISERROR({msg_id|msg_str|@local_variable}
{,severity,state}
[,argument[,...n]])
[WITHoption[,...n]]
备注
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-SQLPRINT语句则不支持。
PRINT语句不受TRY块的影响,而在严重级别为11到19的情况下在TRY块中运行的RAISERROR会将控制传输至关联的CATCH块。
指定严重级别为10或更低以使用RAISERROR返回TRY块中的消息,而不必调用CATCH块。
通常,连续的参数替换连续的转换规格;第一个参数替换第一个转换规格,第二个参数替换第二个转换规格,以此类推。
例如,在以下RAISERROR语句中,第一个参数N'number'代替第一个转换规格%s,,第二个参数5代替第二个转换规格%d。
复制代码
RAISERROR(N'Thisismessage%s%d.',--Messagetext.
10,--Severity,
1,--State,
N'number',--Firstargument.
5);--Secondargument.
--Themessagetextreturnedis:
Thisismessagenumber5.
GO
如果为转换规格的宽度或精度指定了星号(*),则要用于宽度或精度的值被指定为整数参数值。
在这种情况下,一个转换规格最多可以使用三个参数,分别用作宽度、精度和替代值。
例如,下列两个RAISERROR语句都返回相同的字符串。
一个指定参数列表中的宽度值和精度值;另一个指定转换规格中的宽度值和精度值:
复制代码
RAISERROR(N'<<%*.*s>>',--Messagetext.
10,--Severity,
1,--State,
7,--Firstargumentusedforwidth.
3,--Secondargumentusedforprecision.
N'abcde');--Thirdargumentsuppliesthestring.
--Themessagetextreturnedis:
<
GO
RAISERROR(N'<<%7.3s>>',--Messagetext.
10,--Severity,
1,--State,
N'abcde');--Firstargumentsuppliesthestring.
--Themessagetextreturnedis:
<
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固定服务器角色成员或具有ALTERTRACE权限的用户才能指定19到25之间的严重级别。
若要使用19到25之间的严重级别,必须选择WITHLOG选项。
注意:
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
在MicrosoftSQLServer数据库引擎 实例的错误日志和应用程序日志中记录错误。
记录到错误日志的错误目前被限定为最多440字节。
只有sysadmin固定服务器角色成员或具有ALTERTRACE权限的用户才能指定WITHLOG。
NOWAIT
将消息立即发送给客户端。
SETERROR
将@@ERROR值和ERROR_NUMBER值设置为msg_id或50000,不用考虑严重级别。
示例
A.从CATCH块返回错误消息
下面的代码示例显示如何在TRY块中使用RAISERROR使执行跳至关联的CATCH块中。
它还显示如何使用RAISERROR返回有关调用CATCH块的错误的信息。
复制代码
BEGINTRY
--RAISERRORwithseverity11-19willcauseexeuctionto
--jumptotheCATCHblock.
RAISERROR('ErrorraisedinTRYblock.',--Messagetext.
16,--Severity.
1--State.
);
ENDTRY
BEGINCATCH
DECLARE@ErrorMessageNVARCHAR(4000);
DECLARE@ErrorSeverityINT;
DECLARE@ErrorStateINT;
SELECT
@ErrorMessage=ERROR_MESSAGE(),
@ErrorSeverity=ERROR_SEVERITY(),
@ErrorState=ERROR_STATE();
--UseRAISERRORinsidetheCATCHblocktoreturnerror
--informationabouttheoriginalerrorthatcaused
--executiontojumptotheCATCHblock.
RAISERROR(@ErrorMessage,--Messagetext.
@ErrorSeverity,--Severity.
@ErrorState--State.
);
ENDCATCH;
B.在sys.messages中创建即席消息
以下代码示例显示如何引发sys.messages目录视图中存储的消息。
该消息通过sp_addmessage系统存储过程,以消息号50005被添加到sys.messages目录视图中。
复制代码
sp_addmessage@msgnum=50005,
@severity=10,
@msgtext=N'<<%7.3s>>';
GO
RAISERROR(50005,--Messageid.
10,--Severity,
1,--State,
N'abcde');--Firstargumentsuppliesthestring.
--Themessagetextreturnedis:
<
GO
sp_dropmessage@msgnum=50005;
GO
C.使用局部变量提供消息文本
以下代码示例显示如何使用局部变量为RAISERROR语句提供消息文本。
复制代码
DECLARE@StringVariableNVARCHAR(50);
SET@StringVariable=N'<<%7.3s>>';
RAISERROR(@StringVariable,--Messagetext.
10,--Severity,
1,--State,
N'abcde');--Firstargumentsuppliesthestring.
--Themessagetextreturnedis:
<
GO
窗体顶端
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RAISERROR 详解