簡易パラメーター化

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

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

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

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

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

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

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

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

SELECT * FROM AdventureWorks2008R2.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 に設定することにより、いくつかの制約に従って、データベース内のすべてのクエリをパラメーター化することを指定できます。これにより、クエリをコンパイルする頻度が下がり、大量のクエリが同時に実行されるデータベースのパフォーマンスが向上します。詳細については、「強制パラメータ化」を参照してください。

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