Я бы порекомендовал параметризованный динамический sql ( sp_executesql )
Пройдя по этому маршруту, вы можете отказаться от любого несоответствующего параметра при построении предложения where.
Пример процедуры:
create proc dbo.SearchForStuff
(
@Id int = 0
,@Description varchar(100) = ''
)
as
begin
set nocount on;
declare @select nvarchar(max) = '
select
s.*
from Stuff as s'
declare @where varchar(max) = ''
if isnull(@ID,0) != 0 begin
set @where += case @where when '' then ' where ' else ' and ' end + 's.Id = @Id'
end
if isnull(@Description,'') != '' begin
set @where += case @where when '' then ' where ' else ' and ' end + 's.[Description] = @Description'
end
set @select += @where
exec sp_executesql
@select
,N'
,@Id int = 0
,@Description varchar(100) = '''''
,@Id
,@Description
end
Использование:
exec SearchForStuff @Id = 1, @Description = 'omg' -- Returns every item where Id is 1 and Description is 'omg'
exec SearchForStuff @Id = 1 -- Returns every item where Id is 1
exec SearchForStuff @Description = 'omg' -- Returns every item where Description is 'omg'
exec SearchForStuff --returns every item
Таким образом, ваш последний запрос не изобилует бесполезными условиями.Кроме того, вы можете получить немного более детальный, чем я здесь.В зависимости от того, какие параметры были переданы, вы можете адаптировать предложения where / join, чтобы использовать ваши индексы таким образом, чтобы получить максимально возможную производительность.Единственным недостатком является небольшая потеря читабельности (imo).