2009-06-18 10 views
0

私は現在、ビジネスオブジェクトに対応する「フィルタ」オブジェクトを持っています。このオブジェクトには、そのようなビジネスオブジェクトのリストをフィルタリング/検索できるさまざまな方法に関連するプロパティがあります。現在、これらの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 "); 
    } 

答えて

0

近代RDBMS'es(実際に考慮するかどうかを言うことができないSQL Server 2000の1、「近代」)は、(もしad-hocクエリ用に最適化されているので、無視できる程度のパフォーマンスヒットがありますどれか)。 sprocを使用して動的SQLを構築しているということは、巨大なデバッグ/サポートPITAです。

+0

sp_executesqlをパラメータとともに使用するとプランの再利用が発生し、プロシージャ・キャッシュが膨大化しないため、アドホック・クエリでは毎回異なるプランが発生するため、この条件は真です。コンバージョンも得られません...'bla'がvarcharであるため、nvarcharカラムがあり、Col = 'bla'を実行すると変換が行われます – SQLMenace

+0

デバッグの問題に関して私は同意しますが、主な選択クエリ文字列はかなり単純な列とダイナミックですセクションは、データをサニタイズすることを目的としたオブジェクトから渡され、SQLを構築します。したがって、ほとんどのデバッグの問題については、Filterオブジェクトにあるものを探す場所が1つあります。 – jwarzech

+0

私はAntonは、間違いなくキャッシュされ、ストアドプロシージャに似たパフォーマンスを持つパラメータ化されたアドホッククエリを意味すると考えています。 –

1

sp_executesqlを使用する必要があります。言い換えれば、クエリプランが保存され、将来の実行が最適化されるからです。また、一般的に動的SQLを実行するよりも優れているようです。

3

を見て正しく

を使用した場合sp_executesqlをもプロシージャキャッシュの肥大化を引き起こすことはありませんはい、クエリのsp_executesqlを意志「キャッシュ」実行計画実行します。

また、ストアドプロシージャにクエリの一部を渡し、そこに完全なクエリを作成し、動的SQLを実行する代わりに、.NET側でクエリ全体を作成し、ADO.NETコマンドオブジェクトを使用して実行できます。 ADO.NETを介して実行されるすべてのクエリは、デフォルトで「キャッシュされる」ようになります。

+1

のみが正しくキャッシュされますが、一部の開発者はsp_executesqlにexecを変更し、sp_executesql内ではparamsを使用しないので、役立たないでしょう。http://blogs.lessthandot.com/index.php/DataMgmt/ DataDesign/changing-exec-to-sp_executesql-doesn-tp – SQLMenace

+0

+1:SQL ServerからSQLステートメントを完全に構築するサポート。より良いトレース/ロギング、優れたデバッグ、コードの可読性の向上。 – van

0

sp_executesqlが最適です。これにストアドプロシージャを使用しない、または少なくともダイナミクスの一部を取り除くことを検討しましたか?どんな種類の注射でもずっと安全だと思います。あなたが話しているようにフィルタを作成しますが、ストアドプロシージャではなく、自分のコードで入力を処理しようとします。私は本当にダイナミックSQLが好きですが、時には余分なマイルに行く方が安全かもしれません。

+0

私は実際にlinq-sql:0)を使いたいと思っています - 悲しいことに、このアプリケーションでは今はオプションがありません。 – jwarzech

+0

私の質問に気にならないなら...なぜそれはオプションではないのですか? – Eric

関連する問題