深入了解 RAISERROR - SQLServer 2005






4.63/5 (25投票s)
本文介绍如何在 SQL Server 2005 中使用 RAISERROR
目录
引言
这是我最近发表的文章“SQL Server 2005 中的错误处理”的一个预扩展。我在其中遗漏了一些关于 raise error 的内容。因此,我将其链接到该文章,以便读者能够更好地了解错误处理。在这里,我只解释了我们在 SQL Server 中通常使用的一些内容。如果您想了解更多详情,请参阅“进一步学习和参考”部分。请提出您宝贵的建议和反馈。
RAISERROR 概述
SQL Server 有其自身的错误处理机制,其中使用 @@Error
来捕获错误,我们可以获取该错误的错误消息。RAISERROR
允许开发人员生成自己的错误消息。使用 RAISERROR
,我们可以在运行查询或存储过程时引发自己的错误消息。RAISERROR
用于以与 SQL Server Database Engine
生成的系统错误或警告消息相同的格式将消息返回给应用程序。我们还可以为每一条消息设置自己的严重性。
总结一下
- 它允许开发人员生成自己的消息
- 它返回的消息格式与 SQL Server Database Engine 生成的消息格式相同
- 我们可以为消息设置自己的严重性级别
- 它可以与查询和存储过程关联
RAISERROR 的通用语法
下面是 RAISERROR
的通用语法
RAISERROR ( { Message ID | Message Text}
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
为了更好地理解,我们将代码块进行分割。
RAISERROR 的参数
RAISERROR ( { Message ID | Message Text}
通常,我们可以使用特定的消息 ID (msg_id
) 或提供错误消息字符串。
消息 ID
是存储在 sys.messages
目录视图中的用户自定义错误消息编号。用户自定义错误消息的错误编号应大于 50000
。默认情况下,RAISERROR
会引发错误编号为 50000
的错误消息。
我们可以使用 sp_addmessge
按以下方式添加错误编号
exec sp_addmessage @msgnum=50009,@severity=1,@msgtext='Custom Error Message'
现在,如果您想检查消息实际存储的位置,需要运行以下查询
select * from sys.messages
请看下面的图片,我将分步进行了说明。现在,暂时忘记 @Severity
参数和其他可选参数。我稍后会解释它们。

这就是数据在 SQL Server 中存储的方式,以及当我们像这样调用时,SQL Server Database Engine 返回的数据...
RAISERROR ( 50009,1,1)
...这将显示以下输出
Custom Error Message
Msg 50009, Level 1, State 1
现在,我想您应该能将这些内容联系起来了。让我们转向消息文本参数。
消息文本
这是消息描述,我在上一个示例中已经解释过,并且您也已经知道它实际存储在哪里。错误消息有某些限制
- 错误消息最多可以包含
2,047
个字符 - 如果消息超过
2,047 个字符
,则只会显示2,044 个字符
,并带有省略号表示消息已被截断
正如我已经提到的,如果我们没有指定消息编号,RAISERROR
默认会使用 50000
ID。这就是为什么我们需要指定大于 50000 的错误消息 ID。如果我们添加 ID 为 50000 的消息,它将引发以下错误
User-defined error messages must have an ID greater than 50000.
消息文本有一些参数。关于这些,我建议您阅读我在“进一步学习”部分提到的文章。
现在,再来看看 RAISERROR
的另外两个参数
RAISERROR ( { Message ID| Message Text}
{ ,severity ,state }
它们代表设置消息的严重性和状态。这两个都是数值类型,与消息的严重程度有关。
严重性
在使用 sp_addmessage
添加消息时,我们必须指定严重性。严重性级别
的范围是 0-25。但对于用户定义的消息,我们必须将其设置为 0-19。20-25 只能由管理员设置。严重性级别 20 到 25
被认为是致命的。
状态
对于任何与 RAISERROR
相关的消息,我们也必须指定状态。默认状态值为 1。状态的范围是从 1 到 127
。但在大多数实现中,我们使用 1。通过为存储过程中的每个 RAISERROR
函数提供不同的状态,我们可以使用它来指示引发了哪个错误。这是一个必需的参数。
WITH 选项
最后,还有一些我们可以设置的选项,即 WITH
选项。
LOG
它会将错误放入 Windows 事件日志。在使用 sp_addmessage
添加消息时,我们必须指定此参数。
exec sp_addmessage @msgnum=50002,@severity=1,_
@msgtext='This Error Message Will Store into EVENT VIEWER',@with_log='true'
现在,如果我们想测试结果,只需执行此命令 RAISERROR ( 50002,1,1)
,我们就可以在 EventViewer
中找到一条记录。

NOWAIT
直接将错误发送到客户端。
SETERROR
它会将错误 ID 替换为 5000。
深入了解 Sp_addmessage
我之前已经解释过。现在我将提供一个简要的总体语法和它需要的参数。
sp_addmessage [ @msgnum= ] msg_id, [ @severity= ] severity ,
[ @msgtext = ' ] 'message'
[, [ @lang = ] 'Language' ]
[, [ @with_log = ] 'log' ]
[, [ @replace = ] 'replace' ]
以下是这些参数的通用概述。
@msgnum
指定消息的编号。它应该大于 50000。
@severity
我们在大多数情况下使用 1。通用范围是 1 到 25。我已经涵盖了细节。
@msgtext
消息文本,最大字符限制为 2,047。超过此限制的消息将被截断。
@lang
如果您想指定任何语言,则使用此参数。
@with_log
正如我在示例中所示,将 'TRUE
' 设置为在 EventViewer
中记录错误。
@replace
如果相同的消息编号已存在,但您想替换该 ID 的字符串,则必须使用此参数。
综合示例
现在来看一个简单的示例,我们可以检查上面讨论过的所有要点。
添加用户自定义消息
要添加错误消息,我们必须使用 sp_addmessgae
存储过程。此消息将存储在 sys.messages
中。错误编号应大于 5000。
exec sp_addmessage @msgnum=50010,@severity=1,_
@msgtext='User-Defined Message with ID 50010'
查看内部详情
这不是强制性的,您可以通过运行以下查询来查看原始位置和存储方式
select * from sys.messages
这将为您提供以下输出
message_id language_id severity is_event_logged text
----------- ----------- -------- --------------- ----------------------------
50010 1033 1 1 User-Defined Message with ID 50010
调用 RAISERROR
现在我们可以使用 RAISERROR
检索消息
RAISERROR ( 50010,1,1)
这将给出以下输出
User-Defined Message with ID 50010
Msg 50010, Level 1, State 1
将错误存储在事件日志中
如果我们需要将消息存储在事件查看器中,我们必须使用 @with_log
参数
sp_addmessage @msgnum=50002,@severity=1,_
@msgtext='This Error Message Will Store into EVENT VIEWER',@with_log='true'
我之前已经讲过它是如何存储在事件查看器中的。
替换现有消息
如果我们已经为某个错误 ID 设置了消息,并且我们想替换该消息,它将引发如下错误
You must specify 'REPLACE' to overwrite an existing message.
So, for replacing message we have to use
@replace parameter with sp_addmessge Stored procedure.
以下是语法
exec sp_addmessage @msgnum=50010,@severity=1,_
@msgtext='User-Defined Message with ID 50010-Replaced Message',_
@with_log='true', @replace='replace'
This will replace the message for the id 50010.
You can try it using run RAISERROR again.
使用 Try-Catch 结合 RAISERROR
下面的代码是一个简单的示例,其中我展示了如何在 TRY-CATCH 块中使用 RAISERROR:
BEGIN TRY
DECLARE @Intval int;
SET @Intval = 1/0; -- Divide by Zero Error
END TRY
BEGIN CATCH
RAISERROR (50009, 11, 1); -- 50009 is our pre-defined error
-- that are stored using sp_addmessage
END CATCH;
参考和进一步研究
历史
- 2009年8月15日:发布初始版本