2017-05-29 124 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)