2011-07-06 14 views
0

検索ページのストアドプロシージャを記述する必要があります。検索ページでは、ユーザーは一部のフィルタで「任意」を選択でき、各フィルタはDB内の列にマップされます。SQLサーバーの条件付きフィルタリング

私のストアドプロシージャでこれをアプローチする最良の方法は何ですか:

(1)私は、選択したフィルタに基づいて、動的SQL(sp_executesqlを)一緒に行くと、クエリを作成する必要がありますか?これは、実行計画のキャッシングに悪影響を及ぼしますか?

(2)私は、「任意の」すべての可能な値に変換し、静的なクエリで同じを使用する必要がありますか?

は(3)私は、必須のフィルタを使用して一時テーブルに結果を格納し、これらの結果に(ANYオプションをサポート)、オプションのフィルタ1対1を適用する必要がありますか?

(4)私が考えていない他の方法はありますか?

SELECT * FROM TABLE 
WHERE (FILTER_FOR_COL_A IS NULL OR COL_A = FILTER_FOR_COL_A) 
AND (FILTER_FOR_COL_B IS NULL OR COL_B = FILTER_FOR_COL_B) 

FILTER_FOR_COL_Aが列COL_Aのフィルタ値である:本当にユーザーがフィルタを選択する方法、私はこのような何かをするだろう知らず

+0

ない完全な答え私はコメントとして投稿しますが、** ** '2'を行いませんので、 - あなたは、リストを指定した場合、それは(すなわちに必要がない場合、クエリエンジンはまだそのフィールドをチェックします'IN'リスト内のテーブルのすべての値のうち、それはまだすべての行をチェックします) – JNK

+3

このトピックに関する必須の読書。 http://www.sommarskog.se/dyn-search.html –

答えて

2

。ユーザーがANYを選択した場合、FILTER_FOR_COL_ANULLになります。明らかに、COL_ANULLにすることができ、ユーザーがこれをフィルターとして指定できるはずである場合、NULLANYフィルターを表す最も良い方法ではありません。このために別の値または第2のパラメータを考える必要があります。さらに、ユーザーが1つの列に対して複数のフィルター値を指定できる場合、この方法は機能しません。

+0

あなたに貧しい実行計画を与えることをお勧めします。アレックスがリンクしているErland Sommarskogのブログでは、いくつかの細部の詳細をカバーしています。ステートメントRECOMPILEを指定してもうまく動作するようにするSQL2008の方法は、SP1 +では壊れており、削除されていませんでした。 –