Поиск по параметру, только если пользователь вводит значение - PullRequest
0 голосов
/ 13 февраля 2009

Я хочу переписать этот запрос таким образом, чтобы, если @UserName было передано с нулевым значением, оно исключало Client_User из критериев поиска. Я хочу, чтобы поиск осуществлялся только по имени, если пользователь вводит имя в текстовое поле имени пользователя в веб-форме. Я не уверен, как это сделать.

select * from weblogs.dbo.vwlogs 
where Log_time between @BeginDate and @EndDAte 
and  client_user=@UserName

Ответы [ 4 ]

5 голосов
/ 13 февраля 2009

выберите * из weblogs.dbo.vwlogs, где Log_time между @BeginDate и @EndDAte а также (@ UserName IS NULL ИЛИ client_user = @ UserName)

0 голосов
/ 14 февраля 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

Как уже упоминалось, это даст выигрыш в производительности. По данным BOL:

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

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

Решение от Кристен будет работать, но если вам нужна производительность, не делайте этого, потому что план будет кэшироваться только для первого условия.

Итак, если ваша процедура сначала вызывается с параметром NULL, этот запрос будет кэширован.

Если вам нужна более высокая производительность, используйте оператор IF и создайте два отдельных запроса.

В более сложных запросах событие sp_execsql будет быстрее.

0 голосов
/ 13 февраля 2009
select * 
from weblogs.dbo.vwlogs 
where Log_time between @BeginDate and @EndDAte 
  and (client_user=@UserName or @UserName IS null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...