私は現在、ビジネスオブジェクトに対応する「フィルタ」オブジェクトを持っています。このオブジェクトには、そのようなビジネスオブジェクトのリストをフィルタリング/検索できるさまざまな方法に関連するプロパティがあります。現在、これらのFilterオブジェクトにはwhere句の内容を作成し、SQL Server 2000のストアドプロシージャに渡され、残りのselectクエリとconcatendatedされるメソッドがあります。最後の文字列は、Execを使用して実行されます。動的SQLを実行する代わりに
現在のところ、これはうまくいきますが、実行プランのキャッシュがないためにパフォーマンスの問題が心配している場合を除き、うまく動作します。いくつかの研究で私は呼び出しの使用を見たsp_executesql;これはより良い解決策ですか、私がやっていることに対してより良い慣習がありますか?
アップデート:私はsp_executesqlをを使用して、問題の一部は、私のフィルタでコレクションに基づいて、私はリストOR文を生成する必要があるということだと思います。私は、 'パラメータ化された'クエリが私の解決策であるとは確信していません。
例
var whereClause = new StringBuilder();
if (Status.Count > 0)
{
whereClause.Append("(");
foreach (OrderStatus item in Status)
{
whereClause.AppendFormat("Orders.Status = {0} OR ", (int)item);
}
whereClause.Remove(whereClause.Length - 4, 3);
whereClause.Append(") AND ");
}
sp_executesqlをパラメータとともに使用するとプランの再利用が発生し、プロシージャ・キャッシュが膨大化しないため、アドホック・クエリでは毎回異なるプランが発生するため、この条件は真です。コンバージョンも得られません...'bla'がvarcharであるため、nvarcharカラムがあり、Col = 'bla'を実行すると変換が行われます – SQLMenace
デバッグの問題に関して私は同意しますが、主な選択クエリ文字列はかなり単純な列とダイナミックですセクションは、データをサニタイズすることを目的としたオブジェクトから渡され、SQLを構築します。したがって、ほとんどのデバッグの問題については、Filterオブジェクトにあるものを探す場所が1つあります。 – jwarzech
私はAntonは、間違いなくキャッシュされ、ストアドプロシージャに似たパフォーマンスを持つパラメータ化されたアドホッククエリを意味すると考えています。 –