sql - 基于sql中的空/非空参数构建where子句

标签 sql sql-server stored-procedures

我正在尝试创建一个存储过程,它将根据输入返回记录。如果所有输入参数都为空,则返回整个表,否则使用参数并返回记录:

 create procedure getRecords @parm1 varchar(10) = null, @parm2 varchar(10) = null, @parm3 varchar(10) = null
 as
 declare @whereClause varchar(500)
 set @whereClause = ' where 1 = 1 '

 if (@parm1 is null and @parm2 is null and @parm3 is null)
    select * from dummyTable
 else
    begin
      if (@parm1 is not null)
         set @whereClause += 'and parm1 = ' + '' + @parm1 + ''
      if (@parm2 is not null)
         set @whereClause += 'and parm2 = ' + '' + @parm2 + ''
      if (@parm3 is not null)
         set @whereClause += 'and parm3 = ' + '' + @parm3 + ''

      select * from dummyTable @whereClause  <-- Error 
    end

创建此过程时出错是“在条件所在的上下文中指定的非 bool 类型的表达式”

如果我构建 where 子句的方法有误,请评论?

谢谢

最佳答案

select * from dummyTable
where (parm1 = @parm1 OR @parm1 IS NULL)
  and (parm2 = @parm2 OR @parm2 IS NULL)
  and (parm3 = @parm3 OR @parm3 IS NULL)
  ;

关于sql - 基于sql中的空/非空参数构建where子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17579402/

相关文章:

stored-procedures - 对存储过程的 JDBC 调用返回 null

sql - 在 SELECT 语句中使用 'previous' 列的结果

sql - 如何通过 sql server 2008 中的 XP_CMDSHELL 通过网络访问文件/文件夹?

php - HTML/PHP post 方法

SQL 递归表无限循环

mysql - 在存储过程 (MySQL) 上使用 WHERE IN

sql - 返回每组的前 n 条记录 Oracle SQL

mysql - 用户 'root' 的访问被拒绝 @'localhost' - root 帐户每次重新启动后都需要重置 PW (Windows 7 SP1)

c# - E.F 上下文 - 存储过程和查询

mysql - 有什么方法可以同时存储 SELECT 结果并输出结果集吗?