最好的方法是使用動態SQL。像這樣:
declare @sql nvarchar(max);
set @sql = 'select * from table';
declare @where nvarchar(max);
set @where = (case when @StartDate is not null then ' and StartDate >= @StartDate' else '' end) +
(case when @EndDate is not null then ' and EndDate >= @EndDate' else '' end) +
(case when @ClientID is not null then ' and ClientID = @ClientID' else '' end);
set @where = stuff(@where, 1, 5, '');
set @sql = @sql + (case when len(@where) > 0 then ' where ' + @where' else '');
exec sp_executesql @sql,
N'@StartDate date, @EndDate date, @ClientId int',
@StartDate = @StartDate, @EndDate = @EndDate, @ClientId = ClientId;
這是更好的原因是因爲輸入的每個可能的組合導致不同的查詢。 SQL Server可以使用適當的索引來優化查詢,使用可選參數時,這種優化可能很重要。
的最佳參考,IMO,是厄蘭Sommarskog的[動態搜索條件在T-SQL](http://www.sommarskog.se/dyn-search.html) –