ご覧のように、「理由」の質問には、言語の歴史的根拠や根底にある仮定など、別の種類の回答が必要ですが、本当にその正義を実行できるかはわかりません。
SQL MVP Erland Sommarskogによるこの包括的な記事は、メカニズムとともにいくつかの理論的根拠を提供しようとしています。
動的SQLの呪いと祝福:
クエリプランのキャッシュ
SQL Serverで実行するすべてのクエリには、クエリプランが必要です。初めてクエリを実行すると、SQL Serverはクエリのクエリプランを作成します-または用語の説明に従って-クエリをコンパイルします。SQL Serverはプランをキャッシュに保存し、次にクエリを実行するときにプランが再利用されます。
これ(およびセキュリティ、以下を参照)がおそらく最大の理由です。
SQLは、クエリは1回限りの操作ではなく、繰り返し使用されるという前提の下で動作します。テーブル(またはデータベース!)がクエリで実際に指定されていない場合、将来の使用のために実行プランを生成および保存する方法はありません。
はい、実行したすべてのクエリが再利用されるわけではありませんが、これはSQLのデフォルトの動作前提であるため、「例外」は例外的であることを意味します。
Erlandがリストした他のいくつかの理由(彼はストアドプロシージャを使用する利点を明示的にリストしていますが、これらの多くはパラメータ化された(動的でない)クエリの利点でもあることに注意してください):
- 許可システム:SQLエンジンは、操作対象のテーブル(またはデータベース)がわからない場合、クエリを実行する権限があるかどうかを予測できません。動的SQLを使用した「パーミッションチェーン」は、苦痛です。
- ネットワークトラフィックの削減:ストアドプロシージャの名前といくつかのパラメーター値をネットワーク経由で渡すことは、長いクエリステートメントよりも短くなります。
- ロジックのカプセル化:他のプログラミング環境のロジックをカプセル化することの利点に精通している必要があります。
- 使用されているものを追跡する:列定義を変更する必要がある場合、それを呼び出すすべてのコードを見つけるにはどうすればよいですか?コードがストアドプロシージャにある場合のみ、SQLデータベース内の依存関係を見つけるためのシステムプロシージャが存在します。
- SQLコードの記述のしやすさ:ストアドプロシージャを作成または変更するときに構文チェックが行われるため、エラーが少なくなることが期待されます。
- バグと問題への対処:DBAは、刻々と変化する動的SQLよりもはるかに簡単に、個々のストアドプロシージャのパフォーマンスをトレースおよび測定できます。
繰り返しますが、これらのそれぞれには、ここでは取り上げない100のニュアンスがあります。