我想重写此查询,以便在@UserName以空值传递时,它会使Client_User超出搜索条件。如果用户在webform上的用户名文本框中输入名称,我只希望它按名称搜索。我不知道该怎么做。
select * from weblogs.dbo.vwlogs
where Log_time between @BeginDate and @EndDAte
and client_user=@UserName
答案 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™查询优化器可能会重复使用它为第一次执行生成的执行计划。