2012-03-15 62 views
3

以下存儲過程的工作原理,但我想知道 - 是否有最佳做法/模式來處理SQL Server中的這種類型的操作?實質上,我傳遞了兩個不同的參數。根據傳遞給「criteria」參數的內容,我在where子句中運行帶有特定條件的查詢 - 謝謝。多標準存儲過程最佳實踐/模式

ALTER PROCEDURE [dbo].[Select_Project_Info_By_Value] 
    (
    @value VarChar(50), 
    @criteria VarChar(50) 
    ) 

    AS 
    BEGIN 
     SET NOCOUNT ON; 

    if @criteria= 'All' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (NOT (Status = 'ABC')) 

    else if @criteria = 'X' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (Matno LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    else if @criteria = 'Y' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (ID LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    else if @criteria = 'Z' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (ProDescr LIKE '%' + @value + '%') 

    else if @criteria = 'A' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (CustCode LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    else if @criteria = 'B' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (ApplName LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    END 

回答

0

也許是這樣的:

SELECT some some tables... 
FROM   
    dbo.Table1 
WHERE 
    (
     @criteria= 'All' 
     AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'X' 
     AND (Matno LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'Y' 
     AND (ID LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'Z' 
     AND (ProDescr LIKE '%' + @value + '%') 
    ) 
    OR 
    (
     @criteria = 'A' 
     AND (CustCode LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'B' 
     AND (ApplName LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
0

在where子句和動態搜索條件已經寫了厄蘭Sommarskog可選參數的明確工作。 This article詳細介紹了每種方法的優缺點(其中有很多)。該鏈接適用於SQL 2005及更早版本。對於2008年,使用此鏈接(http://www.sommarskog.se/dyn-search-2008.html)

如果我是你,我會審查文章,並選擇一種方法,雖然你的查詢不能真正優化不管你如何寫它。您的LIKE '%' + @value + '%'查詢不能使用索引,並且您將始終執行表掃描。

在這種情況下,您可能會遇到參數嗅探問題,因爲不同的輸入參數可能會產生非常不同的查詢計劃或通過代碼的路徑。這個proc可能是WITH RECOMPILE選項的一個好選擇。