Мне нужно создать хранимую процедуру, которая принимает 12 аргументов, и запрос фильтруется по другой комбинации этих аргументов. Все 12 аргументов не являются обязательными, так как если я передам 3, 5 или 12 аргументов, это зависит от введенных пользователем результатов поиска.
Я могу создать 2 способа: либо с помощью динамического SQL-запроса, либо с помощью операторов «Case where». Пример этих запросов приведен ниже:
Динамический запрос
DECLARE @sql VARCHAR(MAX)
DECLARE @condition VARCHAR(MAX)=''
Declare @var1 varchar(10)
Declare @var2 varchar(10)
Declare @var3 varchar(10)
SET @sql='SELECT * FROM TableDemo1 TD1 WITH(NOLOCK)
INNER JOIN TableDemo2 TD2 ON TD1.Column1=TD2.Column2'
if(@var1 <>0 and @var1 is not null)
begin
if(@condition<>'')
begin
set @condition=@condition + ' and TD1.columnTest1='+@var1)
end
else
begin
set @condition=' where TD1.columnTest1='+@var1
end
end
if(@var2 <>0 and @var2 is not null)
begin
if(@condition<>'')
begin
set @condition=@condition + ' and TD2.columnTest2='+@var2)
end
else
begin
set @condition=' where TD2.columnTest2='+@var2
end
end
if(@var3 <>0 and @var3 is not null)
begin
if(@condition<>'')
begin
set @condition=@condition + ' and TD1.columnTest3='+@var3)
end
else
begin
set @condition=' where TD1.columnTest3='+@var3
end
end
SET @sql=@sql+@condition
EXEC(@sql)
Запрос с ГДЕ ГДЕ
Declare @var1 varchar(10)
Declare @var2 varchar(10)
Declare @var3 varchar(10)
SELECT *
FROM TableDemo1 TD1 WITH(NOLOCK)
INNER JOIN TableDemo2 TD2 ON TD1.Column1=TD2.Column2
WHERE
(CASE WHEN
(@var1<>0 and @var1 is not null)
THEN
CASE WHEN TD1.columnTest1=@var1 THEN 1 ELSE 0 END
ELSE 1 END)=1
AND
(CASE WHEN
(@var2<>0 and @var2 is not null)
THEN
CASE WHEN TD2.columnTest2=@var2 THEN 1 ELSE 0 END
ELSE 1 END)=1
AND
(CASE WHEN
(@var3<>0 AND @var3 IS NOT NULL)
THEN
CASE WHEN TD1.columnTest3 = @var3
THEN 1 ELSE 0 END
ELSE 1 END) =1
Это всего лишь часть моей хранимой процедуры, есть 7-8 таблиц с объединениями и, как указано выше, в различных запросах.
Если я использую динамический запрос, SQL Server должен будет каждый раз создавать план выполнения, но если я использую «case, где», это также замедляет запрос.
Мне известны недостатки динамического SQL, но какую технику мне следует использовать?