Лучшее решение - использовать 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 ™ может повторно использовать план выполнения , который он создает для первого выполнения.