2014-10-09 44 views
1

每一行有沒有在where子句做以下類型的OR條件SQL或條款不讀表

WHERE (@TestID IS NULL OR t.[ID] = @TestID) 

我遇到的問題的一個更好的方法是有很多的,這些在WHERE對不同變量的條款,它造成巨大的數字或讀取。我試圖完成的是如果參數是NULL不評估它,如果它不是NULL然後評估它。我想出了迄今唯一的解決辦法是打破這些進入巨大的查詢檢查填充什麼,並定製查詢這樣的:

IF @TestID IS NOT NULL 
.... 

ELSE IF @TestID IS NULL 
.... 

這變得非常繁瑣和艱苦的許多變量來維護。

+1

這值得一讀:http://blogs.msdn.com/b/bartd/archive/2009/05/03/sometimes-the-simplest-solution-isn-t-the-best-solution-the- all-in-one-search-query.aspx – 2014-10-09 21:23:57

+1

@TimSchmelter這是一篇很好的文章,但有一個更好的方法可以使用證書在動態sql案例中授予權限。請參閱http://www.sommarskog.se/grantperm.html#Certificates – Laurence 2014-10-09 21:29:06

+1

以下是一篇文章,詳細解釋了處理此類捕獲所有查詢的多種方法。 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ – 2014-10-09 21:30:36

回答

3

如果你有很多這樣的,它可能是動態SQL的情況下,因爲這種搜索模式是容易參數嗅探問題。

create proc dbo.MySearch @col1 int, @col2 varchar(30) as 

declare @sql nvarchar(max), @params nvarchar(max); 
set @sql = 'select col1, col2 from dbo.Table where 1 = 1'; 
set @params = '@col1 int, @col2 varchar(30)'; 

if @col1 is not null set @sql += 'and Col1 = @col1'; 
if @col2 is not null set @sql += 'and Col2 = @col2'; 

exec sp_executesql @sql, @params, @col1, @col2; 

雖然管理複雜性的真正答案是編寫一個程序來生成存儲過程!

1
Where ISNULL(t.[ID], @TestId) = @TestId 

這會檢索所有空值和那些符合TestId