2011-11-13 71 views
0

我有一個應用程序,其中用戶可以將我請求的部分或全部參數傳遞給應用程序。 (基本上,只要他們選擇,他或她可以停止爲各種數據提供輸入。)根據他們提供的輸入,我想從MS SQL 2008數據庫中獲取信息,僅使用他們提供給我的參數。存儲過程中的可選屬性WHERE子句

我想像這樣的事情,但我似乎無法得到它的工作,並不知道它是否可以。

CREATE PROCEDURE [dbo].[SearchForSolution] 
    @Input1 int = 0, 
    @Input2 int = 0, 
    @Input3 int = 0, 
AS 
SELECT Name, SolutionValue 
FROM MyTable 
WHERE (IF @Input1 != 0) { BETWEEN LowValue AND HighValue } 
     AND (IF @Input2 != 0) { BETWEEN LowValue AND HighValue } 
     AND (IF @Input3 != 0) { < HighValue }   
RETURN 0 

顯然,這不是工作代碼,但它提供了一般的想法。我希望能夠使用一個變量作爲WHERE子句的一部分,但前提是它不使用幻數(在本例中爲0)。

我對這裏的SQL功能不是很熟悉,也不確定自己想做什麼是可能的。我迄今爲止嘗試過的所有東西都失敗了。如果我在這裏完全走錯了路,我會很欣賞一個指向正確方向的指針。

回答

0

這裏是一個辦法......

SELECT 
    Name, 
    SolutionValue 
FROM 
    MyTable 
WHERE 
    //Compact syntax simple for optional equals filter 
    FIELD1 = ISNULL(@Input1,FIELD1) 
    //intention clearer and let's you do more than equals  
    AND (@Input2 IS NULL OR FIELD2 > @Input2) 
    //can be extended for Between... 
    AND ((@Input3 IS NULL or @Input4 IS NULL) OR FIELD3 BETWEEN @Input3 AND @Input4) 
0

方式一:

WHERE ((@Input1 = 0) OR (@Input1 BETWEEN LowValue AND HighValue)) 
    AND ((@Input2 = 0) OR (@Input2 BETWEEN LowValue AND HighValue)) 
    AND ((@Input3 = 0) OR (@Input3 < HighValue)) 

您也可以更改這些@InputX = 0條件@InputX IS NULL如果你想0可用在第二檢查使用。

0

信息系統中一個非常普遍的需求是具有一個或多個功能,用戶可以通過在許多可能的標準中自由選擇來搜索數據。這是一個棘手的挑戰,因爲您不僅要產生所需的輸出,還必須將響應時間保持在可接受的範圍內,至少對於常見搜索。最重要的是,代碼必須是可維護的,以便您可以輕鬆修改它以滿足新的需求和要求。

有兩種方法可以解決這個問題:動態SQL和靜態SQL。在SQL 2005之前,很難找到易於編寫和維護且性能良好的靜態SQL解決方案,建議使用動態SQL。在SQL 2008中,事情發生了變化。微軟改變了提示OPTION(RECOMPILE),現在它可以像你期望的那樣工作。但是,原始實現中存在嚴重的錯誤,並且您至少需要SQL 2008 SP1或SQL 2008 SP2的CU5才能從此功能中受益。

Erland Sommarskog對這個問題的各種方法及其各自的優缺點有明確的分析。

http://www.sommarskog.se/dyn-search-2008.html

這裏的一些例子會工作得很好了較小的數據集,但我強烈建議你看看這篇文章。