TSQL,Dynamic Where子句

时间:2017-05-29 14:50:47

标签: sql sql-server tsql sql-server-2012

我有一个SQL语句,不同的'Where子句'被赋予不同的参数值传递给存储过程。

我不想为每个传递的级别编写5个不同的SQL语句。我只想到了1个带有CASE STATEMENT的SQL语句。

或者,我可以考虑使用动态SQL,但这有点乱。

以下是我的示例(不在工作状态中) - 任何建议。

这是MS SQL Server 2012

Declare @Level int = 1;

SELECT *

  FROM [HR_MIS_STAGING].[dbo].[XXXXX_Promotions_201510_201610]

where

case @Level when 1 then 
    appt_no = '01';
case @Level when 2 then 
    org = '15';
case @Level when 3 then 
    race = '1';
case @Level when 4 then 
    Gender= 'M';
case @Level when 5 then 
    Prov= 'Nat';

END 

2 个答案:

答案 0 :(得分:3)

做这样的事情:

where (@Level = 1 and appt_no = '01') or
      (@Level = 2 and org = '15') or
      (@Level = 3 and race = '1') or
      (@Level = 4 and Gender = 'M') or
      (@Level = 5 and Prov = 'Nat')

注意:如果使用动态SQL,则生成的查询更有可能使用可用索引。

答案 1 :(得分:1)

这应该有效,我按照上面的建议制作了sql动态: 通过首先使用case语句设置where子句,可以将其插入sql中。 注意别的;当@level与任何给定的情况不匹配时,我已将其设置为显示所有内容。如果您不想在案例不匹配时显示任何内容,只需将其更改为“1 = 0”

DECLARE @level int
SET @level = 4

DECLARE @where nvarchar(max)
DECLARE @sql nvarchar(max)
; 
SET @where = CASE 
  WHEN @level = 1 THEN 'appt_no = ''01'''
  WHEN @level = 2 THEN 'org = ''15'''
  WHEN @Level = 3 THEN 'race = ''1'''
  WHEN @Level = 4 THEN 'Gender= ''M'''
  WHEN @Level = 5 THEN 'Prov= ''Nat'''
  ELSE '1 = 1' 
END 

SET @SQL = 'SELECT *
  FROM [HR_MIS_STAGING].[dbo].[XXXXX_Promotions_201510_201610]
where '+ @where + ''

exec (@sql)