2017-05-29 38 views
0

Iストアドプロシージャに渡されるさまざまなパラメータ値を指定して、異なる 'Where句'を持つSQL文があります。TSQL、動的Where句

渡されたレベルごとに5つの異なるSQL文を書きたくありません。私はケーススタディでただ1つの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 
+0

[この](https://stackoverflow.com/a/10260297/92546)の答えと一致しない場合、あなたは何も表示したくない場合'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句をcase文で最初に設定すると、SQLに挿入できます。 elseに注意してください。 @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)