仅在用户输入值时按参数搜索

时间:2009-02-13 20:45:14

标签: asp.net sql sql-server

我想重写此查询,以便在@UserName以空值传递时,它会使Client_User超出搜索条件。如果用户在webform上的用户名文本框中输入名称,我只希望它按名称搜索。我不知道该怎么做。

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

4 个答案:

答案 0 :(得分:5)

从weblogs.dbo.vwlogs中选择*,其中@BeginDate和@EndDAte之间的Log_time 和 (@ UserName IS NULL或client_user = @ UserName)

答案 1 :(得分:0)

select * 
from weblogs.dbo.vwlogs 
where Log_time between @BeginDate and @EndDAte 
  and (client_user=@UserName or @UserName IS null)

答案 2 :(得分:0)

Kristen的解决方案可行,但如果您需要性能,请不要这样做,因为计划只会针对第一个条件进行缓存。

因此,如果首先使用NULL参数调用过程,则将缓存该查询。

如果您需要更高的性能,请使用IF语句并创建两个不同的查询。

在更复杂的查询中,事件sp_execsql会更快。

答案 3 :(得分:0)

最好的解决方案是使用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

正如muerte所说,这将带来性能优势。据BOL说:

当语句的参数值更改是唯一的变体时,可以使用sp_executesql代替存储过程多次执行Transact-SQL语句。由于Transact-SQL语句本身保持不变且只有参数值发生变化,因此Microsoft®SQLServer™查询优化器可能会重复使用它为第一次执行生成的执行计划