Кодирование хранимой процедуры для экрана поиска с несколькими дополнительными критериями - PullRequest
1 голос
/ 18 февраля 2009

У меня есть экран поиска, на котором пользователь может указать любую комбинацию имени, фамилии, семестра или курса. Я не уверен, как оптимально кодировать хранимую процедуру SQL Server 2005 для обработки этих потенциально необязательных параметров. Какой самый эффективный способ? Отдельные процедуры для каждой комбинации? Принимать элементы в качестве обнуляемых парлов и строить динамический SQL?

Ответы [ 5 ]

7 голосов
/ 18 февраля 2009

Я бы установил каждый параметр как необязательный (значение по умолчанию равно нулю)

, а затем обработать его в ГДЕ ....

FirstName=ISNULL(@FirstName,FirstName)
AND
LastName=ISNULL(@LastName,LastName)
AND
SemesterID=ISNULL(@SemesterID,SemesterID)

Это будет обрабатывать только имя, только фамилию, все три и т. Д. И т. Д.

Это также намного более красиво / управляемо / надежно, чем динамическое построение строки SQL и ее выполнение.

3 голосов
/ 18 февраля 2009

Лучшее решение - использовать sp_execute_sql. Например:

--BEGIN SQL
declare @sql nvarchar(4000)

set @sql = 
'select * from weblogs.dbo.vwlogs 
where Log_time between @BeginDate and @EndDate'
+ case when @UserName is null then '' else 'and client_user = @UserName' end

sp_execute_sql
@sql
, @params = '@UserName varchar(50)'
, @UserName = @UserName
--END SQL

Как уже упоминалось, это даст выигрыш в производительности по сравнению с exec () с аналогичным утверждением.

0 голосов
/ 18 февраля 2009

Как указывает muerte, план будет кэшироваться для первого набора параметров. Это может привести к снижению производительности при его запуске каждый последующий раз с использованием альтернативных параметров. Чтобы решить эту проблему, используйте параметр WITH RECOMPILE в процедуре.

0 голосов
/ 18 февраля 2009

Просто опубликовал ту же концепцию, что и Кевин Фэйрчайлд, именно так мы обычно и поступаем.

Вы можете выполнить динамический sql в своем коде, чтобы создать требуемое выражение, но если это так, вам нужно следить за внедрением sql.

0 голосов
/ 18 февраля 2009

Я бы сделал это с sp_executesql , потому что план будет кэшироваться только для первого шаблона или первого набора условий.

Взгляните на эту статью TechNet :

sp_executesql может использоваться вместо хранимых процедур для многократного выполнения оператора Transact-SQL, когда изменение значений параметра для оператора является единственным вариантом. Поскольку сам оператор Transact-SQL остается постоянным и изменяются только значения параметров, оптимизатор запросов SQL Server, скорее всего, повторно использует план выполнения, который он создает для первого выполнения.

...