2017-02-22 10 views
-1

私は、ストアドプロシージャに含めるwhere句を生成することによってデータベースを検索できるasp.netページを用意しています。問題は、この手順では、さまざまな条件に対して不明な数のパラメータを許可する必要があるということです。非常に単純化された例は、次のようになります。SQLのパラメータに制限のない動的なユーザー生成クエリの作成

SELECT [Column1] FROM [TableName] WHERE 1=1 
--Everything below user generated 
AND 
(
    ([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR 
    ([Column2] = '2' AND [Column3] = '6' AND [Column4] = '8') OR 
    ... 
    ([Column2] = '25' AND [Column3] = '3' AND [Column4] = '1') 
) 
AND [Column5] BETWEEN '10' AND '200' 

私はこのための最良のソリューションが何であるか疑問に思っていました。私は、文字列としてwhere句を作成し、それをストアドプロシージャに1つの大きなパラメータとして渡し、動的SQLとしてロットを実行できることを知っていますが、よりよい解決策は何ですか?

+0

LINQを見るのはいかがですか? –

+1

もしそれが本当に動的であれば、ストアド・プロシージャなしの動的SQLだけで簡単に行うことはできませんか? –

+0

@JamesZこのクエリの部分は、他のいくつかの場所で参照されるはるかに大きな既存のストアドプロシージャの一部です。 – wheresmyducky

答えて

0

最初に、ストアドプロシージャは、最適化された/コンテキスト化された実行計画です。

操作したい列、演算子(=、LIKE、<、...)と検索条件の数(AND/OR)に制限はありません。これは、実行計画には還元できません。

"軽い"制約がある場合でも、([ColumnX] IS NULL OR [ColumnX] = @parameterX) AND ...のような検索条件で多くのパラメータを使用する必要があります。パラメータスニッフィング(more information here)によるパフォーマンスの問題が発生します。また、最適化後も、ASPアプリケーションから構築された単純なSelectよりも高速ではありません。

実際には、ストアドプロシージャを使用したい場合は、実際には動的SQLを使用するのが最適なソリューションです。しかし、単純なクエリ(an example of performance problem)にはないパフォーマンスの問題があります。

私の答えは、ここではストアドプロシージャと使用クエリを忘れています。

関連する問題