一種有效的方式來代替or
s就使用dynamic sql
。
rextester:http://rextester.com/RFHEC49942
create procedure [mytable_get_byMode] (@IncludeMode1 bit, @IncludeMode2 bit, @IncludeMode3 bit) as
begin;
if coalesce(nullif(@IncludeMode1,0),nullif(@IncludeMode2,0),nullif(@IncludeMode3,0))=convert(bit,1)
begin;
declare @sql nvarchar(4000)
select @sql =N'select *
from [dbo].[MyTable] as P
where P.Mode in ('
+stuff(case when @IncludeMode1 = 1 then ',1' else '' end
+case when @IncludeMode2 = 1 then ',2' else '' end
+case when @IncludeMode3 = 1 then ',3' else '' end
,1,1,'')
+N');';
select @sql;
--exec sp_executesql @sql;
end;
end;
go
exec mytable_get_byMode 1,1,1;
exec mytable_get_byMode 0,1,1;
exec mytable_get_byMode 1,0,1;
exec mytable_get_byMode 0,0,0;
關於性能:改進它的唯一機會,就是對'p.mode'和唯一的情況下,指數是否有這些值的持續存在(約)小於20%的行。 –