【问题标题】:Custom Errors in Stored Procedure存储过程中的自定义错误
【发布时间】:2014-06-12 17:05:34
【问题描述】:

网上关于 SQL Server 错误处理的大部分讨论似乎都集中在如何优雅地处理 T-SQL 处理引发的错误,使用 THROW 或 TRY...CATCH 等等。

我拥有的是一个接受多个参数的存储过程。其中一些参数的值必须在一定范围内,所以在我的过程开始时,我想检查从应用程序 (ASP.NET) 传递的值,如果它们不在范围内则返回错误可接受的界限。

目前我有:

IF @RequesterType <> 2 AND @RequesterType <> 3
BEGIN
    RAISERROR('The value for RequesterType must be either 2 (Client) or 3 (Representative)', 10, 1)
    RETURN;
END

当我从 SSMS 中执行包含此代码的过程并传递一个不是 2 或 3 的值时,果然会显示我指定的消息。但它似乎……不够严重。实际发生的错误似乎并不明显。

我知道可以指定 RAISERROR 语句的严重性参数,但除非我将其设置得非常高(>19,我相信),表明一个致命的系统错误,我认为这不会有很大的不同。

我只是想知道,使用我所拥有的代码,当 Web 应用程序调用此过程时,它是否真的会知道发生了错误。调用该过程的 VB.NET 代码是否知道已引发错误?如果没有,我怎么能重新编写我的程序以便它会呢?我确信有一种最佳实践方法可以做到这一点,但目前我觉得我正在尝试破解它。

我使用的是 SQL Server 2012。

【问题讨论】:

  • 如果您的错误级别高于 >= 10 应该没问题,这将导致异常 - 请参阅 stackoverflow.com/questions/963379/…(可能是重复的?)
  • 要添加到@dotnetnate 的评论中,如果您无法控制 VB.net 代码,那么您无能为力。 VB 开发人员有责任适当地处理异常。您的 proc 验证参数值并在必要时将异常(通过 RAISERROR)发送回 Web 应用程序。我会说你已经尽了自己的一份力量。
  • 感谢您的提示。我不认为这是一个重复的问题,因为我确信我正在将错误消息传递回应用程序,只是不确定它是否作为需要处理而不仅仅是信息的实际错误被传递回来。

标签: sql sql-server-2012 raiserror


【解决方案1】:

您应该使用安全级别为 16 的 RAISERROR。根据http://www.sommarskog.se/error-handling-I.html,此值表示:“16 – 其他用户错误”。

例子:

PRINT 'Test #1'
RAISERROR('First bla, bla, bla', 10, 1)
PRINT 'Test #2'
RAISERROR('Second bla, bla, bla', 16, 1)

输出:

Test #1
First bla, bla, bla
Test #2
Msg 50000, Level 16, State 1, Line 4
Second bla, bla, bla

【讨论】:

  • 非常感谢。我看到那篇文章并开始阅读它,但在介绍中提到它是为 SQL Server 2000 编写的,并且较新的版本具有更复杂的错误处理,所以我停在那里继续前进。阅读其他几篇文章,包括 Microsoft 自己关于 RAISERROR 的文章,该文章实际上并未列出各种严重性值及其含义。
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多