Другим вариантом является использование параметризованного SQL с использованием sp_ExecuteSQL в хранимой процедуре, которая защищает вас от SQL-инъекций
например,
DECLARE @SQL Nvarchar(max)
SET @SQL ='select *
from Users
where active = 1'
IF @Name is not null
SET @SQL = @SQL + ' AND name = @Name'
IF @Age is not null
SET @SQL = @SQL + ' AND age = @Age'
IF @City is not null
SET @SQL = @SQL + ' AND city = @City'
exec sp_executeSQL @SQL, N'@Age int,
@Name varchar(255), @City varchar(255)',
@Age,
@Name,
@City
В этом простом случае это, вероятно, не стоит, и я быиспользуйте технику , описанную AR , но если ваш запрос достаточно сложный, он может стоить того.
Например, предположим, что город был в другой таблице, и запись не всегда была там.С техникой AR вам нужно сделать это
select *
-- into #tmp
from Users
LEFT JOIN user_city
ON user.user_Id = user_city.user_Id
and @City is not null --We only want the join when @City is passed in
where active = 1
or (@age is not null and age = @age)
or (@name is not null and name = @name)
or (@city is not null and city = @city)
Обратите внимание на LEFT JOIN
.С динамическим SQL вы просто динамически добавляете INNER JOIN
, когда вам это нужно, что в некоторых случаях даст лучшую производительность.