web-dev-qa-db-ja.com

動的SQL-EXEC(@SQL)対EXEC SP_EXECUTESQL(@SQL)

を使用してSQL Serverのストアドプロシージャで動的SQLコマンドを実行する実際の長所と短所は何ですか

EXEC (@SQL)

versus

EXEC SP_EXECUTESQL @SQL

90
Ash Machine

sp_executesqlは、クエリプランの再利用を促進する可能性が高くなります。 sp_executesqlを使用する場合、パラメーターは呼び出し元の署名で明示的に識別されます。この優れた記事では、この プロセス について説明しています。

ダイナミックSQLの多くの側面についてよく引用されているリファレンスは、Erland Sommarskogの必読です: " ダイナミックSQLの呪いと祝福 "。

93
Mitch Wheat

SP_EXECUTESQLの大きな利点は、パラメーター化されたクエリを作成できることです。これは、SQLインジェクションに関心がある場合に非常に適しています。

20
DJ.

Microsoftの sing sp_executesql の記事では、executeステートメントの代わりにsp_executesqlを使用することを推奨しています。

このストアドプロシージャはパラメータ置換をサポートしているため、sp_executesqlはEXECUTEよりも汎用性があります。また、sp_executesqlはSQL Serverで再利用される可能性が高い実行計画を生成するため、sp_executesqlはEXECUTEよりもより効率的です

したがって、テイクアウェイ:execute statementは使用しないでください。 sp_executesqlを使用します。

5
Gan

最近は常にsp_executesqlを使用していますが、実際には、パラメーターと変数を処理するEXECのラッパーだけです。

ただし、特に複数のデータベースにまたがるデータがあり、インデックススキャンを制限するためにCONSTRAINTを使用している場合、非常に大きなデータベースでクエリをチューニングする場合は、OPTION RECOMPILEを忘れないでください。

OPTION RECOMPILEを使用しない限り、SQLサーバーはクエリに対して「すべてに適合するサイズ」の実行計画を作成しようとし、実行されるたびに完全なインデックススキャンを実行します。

これはシークよりもはるかに効率が低く、クエリを実行していない範囲に制限されているインデックス全体をスキャンする可能性があることを意味します:@

2
Ten98