回答

收藏

验证存储过程参数的正确方法

技术问答 技术问答 456 人阅读 | 0 人回复 | 2023-09-14

我有一个存储过程,执行一些参数验证,如果参数无效,应该失败并停止执行。- X: C# e9 {* v1 w. {3 S' l/ G
我的第一种错误检查方法如下:
9 V, `- x" l+ Ncreate proc spBaz(  @fooInt int = 0, @fooString varchar(10) = null, @barInt int = 0, @barString varchar(10) = null)asbegin  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 workend这并没有解决问题,因为严重性18不会停止执行,验证成功会与错误信息一起打印。( h" k4 W; Z! L. I& V6 t
我知道我可以在每个加薪者之后简单地添加回报,但这对我来说似乎很丑:7 P: ^, D  q4 J6 q: `1 f
        if (@fooInt = 0 and (@fooString is null or @fooString = ) begin    raiserror('invalid parameter: foo    return  end  ...  print 'validation succeeded'  -- do some work因严重性为11或更高的错误而被捕获try / catch因此,我测试的另一种方法是在块中包装错误检查try /
: L9 [0 K1 o8 ccatch块中。问题是该错误被吞没了,根本没有发送给客户端。因此,我进行了一些研究,找到了一种重新抛出错误的方法:+ i0 j5 S6 l0 Q; H# W8 x. ?
        begin try    if (@fooInt = 0 and (@fooString is null or @fooString =   )raiserror('invalid parameter: foo    ...  end try  begin catch    exec usp_RethrowError    return  end catch  print 'validation succeeded'  -- do some work我仍然对这种方法不满意,所以我问你:
# c  n0 ~# L/ P& g4 m您的参数验证效果如何?这种检查是否有最佳实践?& z) d2 V8 f" b( a/ g
                                                                  b3 }* w; k: c) B* [: ^
    解决方案:                                                               
2 d3 M7 u% \5 G7 C0 G3 i' n! S                                                                我认为没有唯一的正确方法可以做到这一点。
" @& ]7 \; O3 t2 f, W我自己的偏好类似于你的第二个例子,但每个参数都有一个单独的验证步骤和更清晰的错误信息。
  a- o& ^6 C2 X0 [, C8 D正如你所说,这有点麻烦和丑陋,但代码的意图对任何阅读它的人来说都是显而易见的,并且可以完成工作。2 T. m0 h# {& }( Z+ R* E9 d8 K
IF (ISNULL(@fooInt,0) = 0)BEGIN    RAISERROR('Invalid parameter: @fooInt cannot be NULL or zero    RETURNENDIF (ISNULL(@fooString,'') = '')BEGIN    RAISERROR('Invalid parameter: @fooString cannot be NULL or empty    RETURNEND
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则