ステートメント パラメーターの使用 - パラメーターのバインド
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQL ステートメントの各パラメーター マーカーは、ステートメントを実行する前に、アプリケーション内の変数に関連付けられているか、バインドされている必要があります。 これを行うには、 SQLBindParameter 関数を呼び出します。 SQLBindParameter は、ドライバーに対するプログラム変数 (アドレス、C データ型など) を記述します。 また、序数値を示すことでパラメーター マーカーを識別してから、そのパラメーター マーカーが表す SQL オブジェクト表現 (SQL データ型、有効桁数など) を記述します。
パラメーター マーカーは、ステートメントの実行前にいつでもバインドまたは再バインドできます。 次のいずれかの操作を行うまでは、パラメーターのバインドは有効なままです。
Option パラメーターをSQL_RESET_PARAMSに設定したSQLFreeStmtを呼び出すと、ステートメント ハンドルにバインドされているすべてのパラメーターが解放されます。
ParameterNumberバインドされたパラメーター マーカーの序数に設定されたSQLBindParameterへの呼び出しは、前のバインディングを自動的に解放します。
アプリケーションでは、プログラム変数の配列にパラメーターをバインドして、SQL ステートメントをバッチで処理することもできます。 配列のバインドには、次の 2 種類があります。
列方向のバインドは、各パラメーターを変数の独自の配列にバインドすることで行います。
列方向のバインドは、 SQLSetStmtAttr Attribute を SQL_ATTR_PARAM_BIND_TYPE に設定し、 ValuePtr を SQL_PARAM_BIND_BY_COLUMN に設定して呼び出すことによって指定します。
行方向のバインドは、SQL ステートメント内のすべてのパラメーターを 1 単位として、パラメーターの各変数を保持する構造体の配列にバインドすることで行います。
行方向のバインドは、 AttributeをSQL_ATTR_PARAM_BIND_TYPEに設定しプログラム変数を保持する構造体のサイズに設定 sqlSetStmtAttrを呼び出すことによって指定します。
SQL Server Native Client ODBC ドライバーは、文字またはバイナリ文字列パラメーターをサーバーに送信するときに、 SQLBindParameter ColumnSize パラメーターで指定された長さに値を埋め込みます。 ODBC 2.x アプリケーションで ColumnSize に 0 が指定されている場合、ドライバーはパラメーター値をデータ型の有効桁数に埋め込みます。 精度は、SQL Server サーバーに接続した場合は 8000、以前のバージョンの SQL Server に接続した場合は 255 です。 ColumnSize はバリアント列の場合はバイト単位です。
SQL Server では、ストアド プロシージャ パラメーターの名前の定義がサポートされています。 ODBC 3.5 では、SQL Server ストアド プロシージャの呼び出し時に使用される名前付きパラメーターのサポートも導入されました。 このサポートは次の目的に使用します。
ストアド プロシージャを呼び出し、そのストアド プロシージャ用に定義したパラメーターのサブセットに値を提供します。
アプリケーション内で、ストアド プロシージャの作成時に指定した順序とは異なる順序でパラメーターを指定します。
名前付きパラメーターは、Transact-SQL EXECUTE ステートメントまたは ODBC CALL エスケープ シーケンスを使用してストアド プロシージャを実行する場合にのみサポートされます。
ストアド プロシージャ パラメーター SQL_DESC_NAME 設定されている場合は、クエリ内のすべてのストアド プロシージャ パラメーターも SQL_DESC_NAME設定する必要があります。 パラメーターが SQL_DESC_NAME 設定されているストアド プロシージャ呼び出しでリテラルを使用する場合、リテラルは形式 'name=value' を使用する必要があります。ここで、 name はストアド プロシージャ パラメーター名 (たとえば、 @p1))。 詳細については、「 名前によるパラメーターのバインド (名前付きパラメーター)」を参照してください。