2012-09-19 65 views
2

我有一個存儲過程,它非常簡單,只有一個select語句,但where子句根據參數進行更改。sql server 2008存儲過程優化

我使用if else語句並寫出select 4次,有沒有更好的方法來簡化這個存儲過程?

IF @Status > 0 
     BEGIN 
      IF @Group = '' 
       BEGIN 
        SELECT * 
        FROM (SELECT tbl.* , 
             ROW_NUMBER() OVER (ORDER BY tbl.NDB_No) rownum 
           FROM  dbo.FoodAbbrev AS tbl 
           WHERE  Status = @Status 
          ) seq 
        WHERE seq.rownum BETWEEN @X AND @Y 
        ORDER BY seq.rownum 
       END 
      ELSE 
       BEGIN 
        SELECT * 
        FROM (SELECT tbl.* , 
             ROW_NUMBER() OVER (ORDER BY tbl.NDB_No) rownum 
           FROM  dbo.FoodAbbrev AS tbl 
           WHERE  Status = @Status 
             AND GroupCd = @Group 
          ) seq 
        WHERE seq.rownum BETWEEN @X AND @Y 
        ORDER BY seq.rownum 

       END 
     END 
    ELSE 
     BEGIN 
      IF @Group = '' 
       BEGIN 
        SELECT * 
        FROM (SELECT tbl.* , 
             ROW_NUMBER() OVER (ORDER BY tbl.NDB_No) rownum 
           FROM  dbo.FoodAbbrev AS tbl 
          ) seq 
        WHERE seq.rownum BETWEEN @X AND @Y 
        ORDER BY seq.rownum 
       END 
      ELSE 
       BEGIN 
        SELECT * 
        FROM (SELECT tbl.* , 
             ROW_NUMBER() OVER (ORDER BY tbl.NDB_No) rownum 
           FROM  dbo.FoodAbbrev AS tbl 
           WHERE  GroupCd = @Group 
          ) seq 
        WHERE seq.rownum BETWEEN @X AND @Y 
        ORDER BY seq.rownum 

       END 
     END 
END 
+0

厄蘭Sommarskog的優秀【動態搜索條件在SQL](HTTP://www.sommarskog。 se/dyn-search.html)通常會是一個很好的開始。 –

回答

0

與可選參數下面一個SELECT statments更換所有這些IF聲明:

SELECT * 
    FROM (SELECT tbl.* , 
      ROW_NUMBER() OVER (ORDER BY tbl.NDB_No) rownum 
      FROM  dbo.FoodAbbrev AS tbl 
      WHERE  1 = 1 
      AND (@Group IS NULL OR GroupCd = @Group) 
      AND (@Status IS NULL OR Status = @Status) 
    ) seq 
    WHERE seq.rownum BETWEEN @X AND @Y 
    ORDER BY seq.rownum 
0
   SELECT * 
       FROM (SELECT tbl.* , 
            ROW_NUMBER() OVER (ORDER BY tbl.NDB_No) rownum 
          FROM  dbo.FoodAbbrev AS tbl 
          WHERE  ISNULL(Status,0) = CASE WHEN @Status > 0 THEN @Status ELSE ISNULL(Status,0) END 
          AND  ISNULL(GroupCd, '') = CASE WHEN @Group = '' THEN ISNULL(GroupCd, '') ELSE @Group END 
         ) seq 
       WHERE seq.rownum BETWEEN @X AND @Y 
       ORDER BY seq.rownum