我有一个存储过程,它执行一些参数验证,如果参数无效,应该会失败并停止执行。执行存储过程参数验证的“正确”方式
我的错误第一种方法检查是这样的:
create proc spBaz
(
@fooInt int = 0,
@fooString varchar(10) = null,
@barInt int = 0,
@barString varchar(10) = null
)
as
begin
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
raiserror('invalid parameter: foo', 18, 0)
if (@barInt = 0 and (@barString is null or @barString = ''))
raiserror('invalid parameter: bar', 18, 0)
print 'validation succeeded'
-- do some work
end
这并没有这样的伎俩,因为严重性18不停止执行和“验证成功”与错误信息一起打印。
我知道我可以简单地增加每RAISERROR后回报,但这个看起来有点丑对我说:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
由于严重性11错误和更高一个try/catch块内抓我测试了另一种方法是封装我的错误检查里面这样一个try/catch块。问题在于错误被吞噬了,根本没有发送给客户端。所以我做了一些研究,发现了一种rethrow错误:
我还是不满意这种做法,所以我问你:
请问你的参数验证样子的?做这种检查有没有某种“最佳做法”?
是否有任何理由为什么你使用IF(ISNULL(@fooString,'')='')而不是IF(@fooString为null)? – macleojw 2009-06-29 12:22:26
@macleojw:他同时检查null和''..聪明:) – VVS 2009-06-29 12:23:31
第二个验证程序的语法无效:'RAISEERROR'。应该只有一个'e'。有趣的是,在英语中它是正确的,因为'raise + error'具有双'e',但不是MS SQL语言。 – 2012-06-19 11:25:05