を使用してSQL Serverのストアドプロシージャで動的SQLコマンドを実行する実際の長所と短所は何ですか
EXEC (@SQL)
versus
EXEC SP_EXECUTESQL @SQL
?
sp_executesql
は、クエリプランの再利用を促進する可能性が高くなります。 sp_executesql
を使用する場合、パラメーターは呼び出し元の署名で明示的に識別されます。この優れた記事では、この プロセス について説明しています。
ダイナミックSQLの多くの側面についてよく引用されているリファレンスは、Erland Sommarskogの必読です: " ダイナミックSQLの呪いと祝福 "。
SP_EXECUTESQLの大きな利点は、パラメーター化されたクエリを作成できることです。これは、SQLインジェクションに関心がある場合に非常に適しています。
Microsoftの sing sp_executesql の記事では、execute
ステートメントの代わりにsp_executesql
を使用することを推奨しています。
このストアドプロシージャはパラメータ置換をサポートしているため、sp_executesqlはEXECUTEよりも汎用性があります。また、sp_executesqlはSQL Serverで再利用される可能性が高い実行計画を生成するため、sp_executesqlはEXECUTEよりもより効率的です。
したがって、テイクアウェイ:execute
statementは使用しないでください。 sp_executesql
を使用します。
最近は常にsp_executesqlを使用していますが、実際には、パラメーターと変数を処理するEXECのラッパーだけです。
ただし、特に複数のデータベースにまたがるデータがあり、インデックススキャンを制限するためにCONSTRAINTを使用している場合、非常に大きなデータベースでクエリをチューニングする場合は、OPTION RECOMPILEを忘れないでください。
OPTION RECOMPILEを使用しない限り、SQLサーバーはクエリに対して「すべてに適合するサイズ」の実行計画を作成しようとし、実行されるたびに完全なインデックススキャンを実行します。
これはシークよりもはるかに効率が低く、クエリを実行していない範囲に制限されているインデックス全体をスキャンする可能性があることを意味します:@