2011-07-06 129 views
0

我需要爲搜索頁面編寫一個存儲過程。搜索頁面允許用戶爲某些過濾器選擇「任何」,每個過濾器映射到我的數據庫中的一列。SQL服務器中的條件過濾

什麼是我的存儲過程接近這一目標的最佳方式:

(1)我應該去使用動態SQL(sp_executesql的),並構建基於過濾器選擇的查詢?這會對緩存執行計劃產生任何負面影響嗎?

(2)我應該將「Any」翻譯爲所有可能的值並在靜態查詢中使用它們嗎? (3)我應該使用強制過濾器將結果存儲在臨時表中,然後在這些結果上逐一應用可選過濾器(支持ANY選項)?

(4)我沒有想過的其他方法?

+0

不是一個完整的答案,所以我會發表評論,但做**不做** 2' - 查詢引擎仍然會檢查該字段,當它不需要(即如果您指定一個列表對於IN列表中所有值的表,它仍然會檢查每一行) – JNK

+3

關於此主題的必讀內容; http://www.sommarskog.se/dyn-search.html –

回答

2

沒有真正知道用戶是如何選擇的過濾器,我會做這樣的事情:

SELECT * FROM TABLE 
WHERE (FILTER_FOR_COL_A IS NULL OR COL_A = FILTER_FOR_COL_A) 
AND (FILTER_FOR_COL_B IS NULL OR COL_B = FILTER_FOR_COL_B) 

FILTER_FOR_COL_ACOL_A列的篩選值。如果用戶選擇了ANY,則FILTER_FOR_COL_A將是NULL。顯然,如果COL_A可以是NULL,並且用戶應該能夠將其指定爲過濾器,但NULL不是表示ANY過濾器的最佳方式。您需要爲此考慮另一個值或第二個參數。此外,如果用戶可以爲一列指定多個過濾器值,則此方法將不起作用。

+0

保證給你很差的執行計劃。埃裏蘭Sommarskog的亞歷克斯鏈接到的博客涵蓋了一些血淋淋的細節。不是通過指定語句RECOMPILE在SP1 +中被破壞並被刪除的SQL2008方法來讓您的示例運行良好。 –