簡易パラメータ化

SQL Server では、Transact-SQL ステートメントでパラメータまたはパラメータ マーカーを使用することで、新しい SQL ステートメントと既存のコンパイル済みの実行プランとを照合するリレーショナル エンジンの機能を向上させています。

セキュリティに関する注意セキュリティに関する注意

パラメータまたはパラメータ マーカーを使用してエンド ユーザーが入力した値を保持する方法は、後からデータ アクセス API メソッド、EXECUTE ステートメント、または sp_executesql ストアド プロシージャのいずれかを使用して実行される文字列に値を連結する方法よりも安全です。

パラメータを指定せずに SQL ステートメントを実行した場合、SQL Server はステートメントを内部でパラメータ化することにより、既存の実行プランとの照合機能を高めます。この処理を簡易パラメータ化と呼びます。SQL Server 2000 では、この処理を自動パラメータ化と呼んでいました。

次のステートメントについて考えてみます。

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 1;

ステートメントの最後の値 1 は、パラメータとして指定できます。リレーショナル エンジンにより、値 1 の位置にパラメータが指定されたときと同様にこのバッチの実行プランが構築されます。この簡易パラメータ化により、SQL Server で次の 2 つのステートメントから基本的に同じ実行プランが生成されると認識され、2 番目のステートメントにも最初のプランが再利用されます。

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 1;

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 4;

複雑な SQL ステートメントを処理する場合、リレーショナル エンジンでは、どの式をパラメータ化できるのかを簡単に決定できないことがあります。複雑な SQL ステートメントと既存の使用されていない実行プランを照合するリレーショナル エンジンの機能を向上するには、sp_executesql またはパラメータ マーカーを使用してパラメータを明示的に指定します。詳細については、「パラメータと実行プランの再利用」を参照してください。

注意注意

+、-、*、/、または % の算術演算子を使用して int、smallint、tinyint、または bigint の定数値を float、real、decimal、または numeric のデータ型に暗黙的にまたは明示的に変換した場合、その式の結果の型および有効桁数を計算するための特定の規則が SQL Server により適用されます。ただし、これらの規則はクエリがパラメータ化されるかどうかによって異なります。したがって、クエリ内の類似の式から異なる結果が生成される場合があります。詳細については、「int、bigint、smallint、および tinyint (Transact-SQL)」を参照してください。

簡易パラメータ化の既定の動作では、SQL Server により、比較的小さなクエリがパラメータ化されます。ただし、ALTER DATABASE コマンドの PARAMETERIZATION オプションを FORCED に設定することにより、いくつかの制約に従って、データベース内のすべてのクエリをパラメータ化することを指定できます。これにより、クエリをコンパイルする頻度が下がり、大量のクエリが同時に実行されるデータベースのパフォーマンスが向上します。詳細については、「強制パラメータ化」を参照してください。

また、単一クエリと、単一クエリと構文的に等しくパラメータ値だけが異なるクエリをパラメータ化することを指定できます。詳細については、「プラン ガイドを使用したクエリのパラメータ化動作の指定」を参照してください。