gpt4 book ai didi

sql - "right"进行存储过程参数验证的方法

转载 作者:行者123 更新时间:2023-12-01 19:04:08 26 4
gpt4 key购买 nike

我有一个存储过程,它执行一些参数验证,如果参数无效,则应该失败并停止执行。

我的第一个错误检查方法如下:

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 之后添加一个 return,但这对我来说看起来有点难看:

  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 block 中捕获的,所以我测试的另一种方法是将错误检查封装在这样的 try/catch block 中。问题是错误被吞没了,根本没有发送给客户端。所以我做了一些研究,找到了一种方法rethrow错误:

  begin try
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
raiserror('invalid parameter: foo', 18, 0)

...
end try
begin catch
exec usp_RethrowError
return
end catch

print 'validation succeeded'
-- do some work

我对这种方法仍然不满意,所以我问你:

您的参数验证是什么样的?是否有某种“最佳实践”来进行这种检查?

最佳答案

我认为没有单一的“正确”方法可以做到这一点。

我自己的偏好与您的第二个示例类似,但每个参数都有单独的验证步骤和更明确的错误消息。

正如你所说,这有点麻烦和丑陋,但是代码的意图对于任何阅读它的人来说都是显而易见的,并且它完成了工作。

IF (ISNULL(@fooInt, 0) = 0)
BEGIN
RAISERROR('Invalid parameter: @fooInt cannot be NULL or zero', 18, 0)
RETURN
END

IF (ISNULL(@fooString, '') = '')
BEGIN
RAISERROR('Invalid parameter: @fooString cannot be NULL or empty', 18, 0)
RETURN
END

关于sql - "right"进行存储过程参数验证的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1057959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com