2012-03-15 12 views
3

次のストアドプロシージャは機能しますが、SQL Serverでこのタイプのアクションを処理するためのベストプラクティス/パターンがありますか?本質的に、私は2つの異なるパラメータを渡しています。 "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

このような何か:句と動的な検索条件はErland Sommarskogによって書かれた場所にあるオプションのパラメータの

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

決定的作品。 This articleには、各アプローチのメリットとデメリットが詳細に記載されています(その中には多数あります)。そのリンクはSQL 2005以前のものです。 2008年の場合は、このリンクを使用してください。(0120)あなたがそれをどのように書いても。 LIKE '%' + @value + '%'クエリではインデックスを使用できず、常にテーブルスキャンを実行します。

このような状況では、入力パラメータが異なると、コードを通じて異なるクエリプランやパスが生成される可能性があるため、パラメータスニッフィングに関する問題が発生する可能性があります。このプロシージャは、WITH RECOMPILEオプションの候補になる可能性があります。