2011-08-04 9 views
2

データベース内のレコードフィルタ条件(基本的にWHEREのSELECTクエリの後ろにあるもの)を保存し、後でこの条件をSELECTで使用したいと考えています。このシナリオでは、フィルタ基準がユーザによって設定され(まれに)、この基準はデータレコードが取得されるたびに(頻繁に)使用されます。sqlクエリでレコードフィルタ条件を保存する

フィルタ条件は、(x AND y)OR zなどのブール式です。 x、yおよびzは、ジャンクション・テーブルを使用してデータ・レコードに接続できるキーワードです。

式をtext/xmlとして保存して解析し、データを取得するたびに動的にSQLクエリを作成できますが、これは非効率的です。

良い方法がありますか?

答えて

2

カラム選択が静的である場合は、そのクエリからStoredProcedureを作成し、StoredProcedure名をいくつかの 'QueryMaster'テーブルに格納することもできます。その方法で動的クエリをExec SP_EXECUTESQL <SP_NAME> <Params>に制限し、主な選択に対してコンパイルされたクエリの利点を得ることができます。

Avoid Conversions In Execution Plans By Using sp_executesql Instead of Execとすることができます。

カラムの選択も静的でない場合は、ストアドprocsの代わりにビューを作成することができます。これはおそらく、あなたのメインテーブルが大きい場合や、たくさんのジョインを使用している場合にのみ良いでしょう。

これは、可能なフィルタ基準が多数あり、実際のフィルタ基準が少ないことを前提としています。たとえば、ユーザーがフィルタリングできる列は100種類ありますが、おそらく25-30通りの組み合わせを作成しておきます。

あなたはいくつかの例についてImplementing Dynamic WHERE-Clause in Static SQLを参照してくださいなど、句がCaseIsNullCollaceを使用している単一のユニバーサルを作成することですより良い方法でフィルタリングする列の数が限られている場合。

+0

偉大な答え、ありがとうございます。 – Pking

0

この問題の解決策はありません。フィルタ基準(where句)は、データベースまたはファイルのどこかに格納する必要があります。クエリを実行するときはいつでも、ファイル/ dbからフィルタ条件の詳細を取得し、いくつかのコードを使用してクエリを構築する必要があります。

私はこれを回避する方法はないと思います - DBシステムにはこれを助ける機能がありません。

効率が問題になっている場合は、フィルタの詳細を最初に読み込んだ後にキャッシュすることができます。