2017-05-29 115 views
0

我有一条SQL语句,其中有不同的'Where子句'给出不同的参数值传递给一个存储过程。TSQL,动态Where子句

我不想为每个传递的级别编写5个不同的SQL语句。我想到了一个SQL语句和一个CASE语句。

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

下面是我的例子(不是工作顺序) - 任何建议plse。

这是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 
+0

[This](https://stackoverflow.com/a/10260297/92546)answer演示如何在'on'或'where'子句中使用'case' _expression_。由于参数嗅探,性能可能是预编译语句的问题。 – HABO

回答

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,则得到的查询更容易利用现有的索引。

+0

今天早上你的解决方案曙光 - 赞赏! – Stefan

1

这应该工作,我做了如上建议的SQL动态: 通过设置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)