ステートメント パラメーター

パラメーターは、SQL ステートメント内の変数です。 たとえば、Part 表に PartID、Description、Price という名前の列があるとします。 パラメーターを指定せずにパーツを追加するには、次のような SQL ステートメントを作成する必要があります。

INSERT INTO Parts (PartID, Description, Price) VALUES (2100, 'Drive shaft', 50.00)  

このステートメントは新しい注文を挿入しますが、挿入する値をアプリケーションにハードコーディングできないため、注文入力アプリケーションに適したソリューションではありません。 挿入する値を使用して、実行時に SQL ステートメントを構築するという方法もあります。 これも、実行時にステートメントを構築する複雑さがあるため、適切なソリューションといえません。 最適なソリューションは、VALUES 句の要素を疑問符 (?) または パラメーター マーカー に置き換える方法です。

INSERT INTO Parts (PartID, Description, Price) VALUES (?, ?, ?)  

これらのパラメーター マーカーは、その後アプリケーション変数にバインドされます。 新しい行を追加する場合は、アプリケーションでこれらの変数に値を設定し、ステートメントを実行するだけです。 ドライバーで、変数から現在値が取得され、データ ソースに送信されます。 ステートメントを複数回実行する場合は、そのステートメントを準備することで、アプリケーションの処理がより効率的にできます。

先ほど示したステートメントは、新しい行を挿入するために注文入力アプリケーションでハードコーディングされている可能性があります。 ただし、パラメーター マーカーは垂直アプリケーションに限定されません。 どのようなアプリケーションでも、テキスト間の変換を回避することで、実行時に SQL ステートメントを構築するのが容易になります。 たとえば、先ほど示したパーツ ID は、ほとんどの場合、アプリケーションに整数として格納されます。 SQL ステートメントがパラメーター マーカーなしで構築されている場合、アプリケーションはパーツ ID をテキストに変換し、データ ソースはそれを整数に戻す必要があります。 アプリケーションは、パラメーター マーカーを使用して、パーツ ID を整数としてドライバーに送信でき、ドライバーは、通常それを整数としてデータ ソースに送信できます。 これで、2 つの変換が保存されます。 長いデータ値の場合、このような値のテキスト形式が SQL ステートメントの許容長を超える場合が多いため、これは非常に重要です。

パラメーターは、SQL ステートメント内の特定の場所でのみ有効です。 たとえば、これらは選択リスト (SELECT ステートメントによって返される列の一覧) では許可されず、等号 (=) などの 2 項演算子の両方のオペランドとして許可されません。パラメーターの型を特定することはできないためです。 一般に、パラメーターはデータ操作言語 (DML) ステートメントでのみ有効であり、データ定義言語 (DDL) ステートメントでは有効ではありません。 詳細については、「付録 C: SQL 文法の パラメーター マーカー」を参照してください。

SQL ステートメントがプロシージャを呼び出すときは、名前付きパラメーターを使用できます。 名前付きパラメーターは、SQL ステートメント内での位置ではなく、名前によって識別されます。 これらは SQLBindParameter の呼び出しによってバインドできますが、パラメーターは、SQLBindParameterParameterNumber 引数ではなく、IPD (実装パラメーター記述子) の SQL_DESC_NAME フィールドによって識別されます。 SQLSetDescField または SQLSetDescRec を呼び出すことによってバインドすることもできます。 名前付きパラメーターの詳細については、このセクションで後述する 「名前によるパラメーターのバインド (名前付きパラメーター)」を参照してください。 記述子の詳細については、「記述子」を参照してください。

このセクションでは、次のトピックを扱います。