存储过程中的自定义错误

时间:2014-06-12 17:05:34

标签: sql sql-server-2012 raiserror

关于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。

1 个答案:

答案 0 :(得分:1)

您应该使用具有安全级别16的RAISERROR。根据http://www.sommarskog.se/error-handling-I.html,此值表示:&#34; 16 - 其他用户错误&#34;。

示例:

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