2011-08-04 35 views
2

我希望能夠在數據庫中存儲記錄過濾標準(基本上是在SELECT查詢中的WHERE後面出現的內容),並且我希望稍後在SELECT中使用此標準。這種情況是由用戶設置過濾器標準(很少),並且每次檢索數據記錄時都會使用此標準(通常)。在sql查詢中保存記錄過濾標準

過濾條件是一個布爾表達式,如:(x AND y)或z。 x,y和z是可以通過聯結表連接到數據記錄的關鍵字。

我可以將表達式存儲爲text/xml,然後解析它並在每次我想要檢索數據時動態構造一個sql查詢,但這看起來效率不高。

有沒有更好的方法?

回答

2

如果您的列選擇是靜態的,則替代方案可以是從該查詢創建StoredProcedure並將StoredProcedure名稱存儲到某個「QueryMaster」表中。這種方式可以將動態查詢限制在Exec SP_EXECUTESQL <SP_NAME> <Params>之內,併爲您的主要選擇獲得編譯查詢的好處。您可以Avoid Conversions In Execution Plans By Using sp_executesql Instead of Exec

如果你的列選擇也不是靜態的,你可能想創建視圖而不是存儲過程。這可能會更好,只有當你的主表很大或使用很多連接。

這是假設您有大量可能的過濾條件和少量的實際過濾條件。例如,用戶可以過濾100個列 - 但他們可能會創建25-30個這樣的組合並繼續使用它。

如果有限的列數上有更好的方式過濾是其中使用CaseIsNullCollace等條款見Implementing Dynamic WHERE-Clause in Static SQL的幾個例子來創建一個單一的普及。

+0

很好的答案,謝謝。 – Pking

0

我有一種感覺,這個問題沒有更好的解決方案。您必須將過濾條件(where子句)存儲在數據庫或文件中的某處。無論何時您想執行查詢,您都必須從文件/ db中獲取過濾條件詳細信息,並使用一些代碼構建查詢。

我不認爲有什麼辦法可以解決這個問題 - 數據庫系統沒有這個功能。

如果它導致效率問題,您可以在第一次讀取它們之後在某處緩存過濾器細節。