2011-11-13 13 views
0

私は、ユーザーがアプリケーションに要求しているパラメータの一部またはすべてを渡すことができるアプリケーションを用意しています。 (基本的に、彼らはいつでもさまざまなデータへの入力を止めることができます。)彼らが提供している入力に基づいて、MS SQL 2008データベースから、私が与えたパラメータだけを使って情報を取り戻したいと思います。ストアドプロシージャのオプションの属性WHERE句

私はこれのようなものを描いていますが、私はそれを動作させるように見えることはできません。

CREATE PROCEDURE [dbo].[SearchForSolution] 
    @Input1 int = 0, 
    @Input2 int = 0, 
    @Input3 int = 0, 
AS 
SELECT Name, SolutionValue 
FROM MyTable 
WHERE (IF @Input1 != 0) { BETWEEN LowValue AND HighValue } 
     AND (IF @Input2 != 0) { BETWEEN LowValue AND HighValue } 
     AND (IF @Input3 != 0) { < HighValue }   
RETURN 0 

明らかに、これは動作するコードではありませんが、一般的な考え方を示しています。 WHERE句の一部として変数を使用できるようにしたいのですが、マジックナンバー(この場合は0)を使用していない場合のみです。

私はここでSQLの機能に慣れていませんし、私がしたいことが可能かどうかはわかりません。私がこれまでに試したことはすべて失敗しました。もし私がここで間違った道を完全に辿っていれば、私は正しい方向のポインタを感謝するでしょう。ここで

答えて

0

はアプローチです...

SELECT 
    Name, 
    SolutionValue 
FROM 
    MyTable 
WHERE 
    //Compact syntax simple for optional equals filter 
    FIELD1 = ISNULL(@Input1,FIELD1) 
    //intention clearer and let's you do more than equals  
    AND (@Input2 IS NULL OR FIELD2 > @Input2) 
    //can be extended for Between... 
    AND ((@Input3 IS NULL or @Input4 IS NULL) OR FIELD3 BETWEEN @Input3 AND @Input4) 
0

一つの方法:

WHERE ((@Input1 = 0) OR (@Input1 BETWEEN LowValue AND HighValue)) 
    AND ((@Input2 = 0) OR (@Input2 BETWEEN LowValue AND HighValue)) 
    AND ((@Input3 = 0) OR (@Input3 < HighValue)) 

あなたは0が第二のチェックで使用できるようにしたい場合は、@InputX IS NULLにそれらの@InputX = 0条件を変更することができます。

0

情報システムで非常に共通の要件は、ユーザーが多くの可能な基準の中から自由に選択してデータを検索できる1つ以上の機能を持つことです。これは難しい課題です。なぜなら、必要な出力を生成するだけでなく、一般的な検索では応答時間を許容範囲内に抑える必要があるからです。さらに、コードはメンテナンス可能でなければならないため、新しいニーズや要件に合わせて簡単に変更することができます。

この問題を解決するには、動的SQLと静的SQLという2つの方法があります。 SQL 2005までは、静的SQLのための書き込みと保守が簡単で、パフォーマンスは優れていたソリューションを見つけることは難しく、動的SQLを使用することをお勧めしました。 SQL 2008では、物事が変化しました。 MicrosoftはヒントOPTION(RECOMPILE)を変更して、期待どおりに動作するようにしました。しかし、元の実装には深刻なバグがありました。この機能を利用するには、SQL 2008 SP1またはSQL 2008 SP2のCU5以上が必要です。

Erland Sommarskogは、この問題とそれぞれの賛否両論に対するさまざまなアプローチを明確に分析しています。

http://www.sommarskog.se/dyn-search-2008.html

ここでは例のいくつかは、小さなデータセットのためにうまく動作しますが、私は強く、あなたがその記事をチェックアウト励まします。