2010-07-09 47 views
0

我在我的網站上有一個頁面,其中有多個下拉框作爲過濾器。重寫此查詢以使其更具可擴展性

那麼該網頁的SQL程序是這樣的

IF @Filter1 = 0, @Filter2 = 0, @Filter3 = 0 
    BEGIN 

      SELECT * FROM Table1   

    END 

ELSE IF @Filter1 = 1, @Filter2 = 0, @Filter3 = 0 
    BEGIN 

      SELECT * FROM Table2   

    END 

在開始的時候,有每個過濾器,有沒有那麼多的排列只有幾個結果。但是,添加了更多的過濾器,現在有超過20個IF ELSE檢查。因此,如果每個過濾器有5個選項,我將需要做5 * 5 * 5 = 125 IF ELSE檢查以返回依賴於過濾器的數據。

更新 第一個過濾器改變了WHERE條件,第二個過濾器添加多個表的結果集,第三過濾器改變了ORDER BY條件

我怎樣才能讓這個查詢更具擴展性,使得我不必編寫一堆新的IF ELSE語句來檢查每個條件,每次除了使用動態SQL之外還將新的過濾器添加到列表中...

+0

您是否真的從每個過濾器的不同表格中進行選擇,或者WHERE子句是否更改? – 2010-07-09 13:32:51

+0

更新了我的問題以反映您的查詢 – super9 2010-07-09 13:36:47

回答

0

儘管我不喜歡動態SQL,但這可能是時候了。您可以一次構建一個查詢,然後在最後執行它。

如果你不熟悉,語法是這樣的:

DECLARE @SQL VARCHAR(1000) 
SELECT @SQL = 'SELECT * FROM ' + 'SOME_TABLE' 
EXEC(@SQL) 

確保您處理SQL注入攻擊,適當的間距等

在這種情況下,我會做我的最好把這個邏輯放在應用程序代碼中,但這並不總是可能的。如果您使用的是LINQ到SQL或其他LINQ框架,您應該能夠安全地做到這一點,但是可能需要一些創造力來正確構建LINQ查詢。

+0

我看到您使用SELECT來設置@SQL的值。 SET可以使用,對吧?使用SELECT有什麼好處嗎? – 2010-07-09 13:58:13

+0

對,我實際上可能會使用SET,但是我從另一個站點抓取了它 - 我總是忘記在EXEC語句中是否包含parens,所以我先Google搜索了它,並沒有注意到SELECT當您輸入英文單詞時。 – 2010-07-09 14:17:10

+0

您還應該使用sp_executesql,以便在語句中直接使用的任何用戶輸入都可以作爲參數傳遞給語句,這有助於避免注入攻擊。 – 2010-07-09 15:50:00

1

您必須擁有一個規則表,並構建一個查詢,該查詢可能會從表中插入可變數據並附加到字符串以形成sql和使用dyna麥克風的SQL來運行它們。

0

您可以爲每個「過濾器」設置一組視圖,然後根據選擇哪個「過濾器」從適當的視圖中進行選擇。

相關問題