我有一个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
答案 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)