65.9K
CodeProject 正在变化。 阅读更多。
Home

深入了解 RAISERROR - SQLServer 2005

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (25投票s)

2009 年 8 月 15 日

CPOL

6分钟阅读

viewsIcon

591267

本文介绍如何在 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日:发布初始版本
© . All rights reserved.