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

标签 sql sql-server stored-procedures error-handling

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

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

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/

相关文章:

mysql - 按年龄、性别和 MySQL 中请求的报告对数据进行分组

jquery - jqGrid - 未应用日期和时间格式

java - JDBC 实现 : error with regard to parameters

mysql - 按第二个表中的匹配项选择顺序

mysql - 查询返回错误的输出

c# - 如何在 C# 中链接 XY 条形图中的两个 sql 列

第 N 个匹配之前的 SQL 文本?

sql-server - 更新时发生错误..System.Data.SqlClient.SqlException : Procedure or function has too many arguments specified

sql - 超时已过。操作完成前超时时间已过或服务器未响应

c# - 如何通过C#代码部署存储过程?