您應該閱讀Erland Sommarskog的Dynamic Search Conditions in T‑SQL。
如果你使用SQL Server 2008或更高版本,然後使用OPTION(RECOMPILE)
,寫這樣的查詢:
SELECT *
FROM Customer
WHERE
(Name = @SearchValue OR @QueryAll='true')
OPTION (RECOMPILE);
我通常通過NULL
爲@SearchValue
表明此參數應該被忽略,而不是使用單獨的參數@QueryAll
。在本公約中查詢成爲本:
SELECT *
FROM Customer
WHERE
(Name = @SearchValue OR @SearchValue IS NULL)
OPTION (RECOMPILE);
編輯
詳情參見上面的鏈接。總之,OPTION(RECOMPILE)
指示SQL Server在每次運行時重新編譯查詢的執行計劃,而SQL Server將而不是緩存生成的計劃。重新編譯還意味着任何變量的值都有效地內聯到查詢中,並且優化器知道它們。
所以,如果@SearchValue
是NULL
,優化器是足夠聰明的生成計劃,如果查詢是這樣的:
SELECT *
FROM Customer
如果@SearchValue
具有非NULL值「ABC」,優化器是足夠聰明到生成的計劃,如果查詢是這樣的:
SELECT *
FROM Customer
WHERE (Name = 'abc')
的OPTION(RECOMPILE)
明顯的缺點是增加了對重新編譯(一般在幾百毫秒),如果你運行它可以是顯著的開銷經常查詢。
注:如果'Name'是空的,第三個查詢不會返回其中'Name'是空行。另外,請閱讀wild的[catch-all queries article]中的sql。(http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) –