テーブル値パラメーターを含むコマンドの実行
テーブル値パラメーターを含むコマンドを実行するには、次の 2 つのフェーズが必要になります。
パラメーターの型を指定する。
パラメーター データをバインドする。
テーブル値パラメーターの指定
コンシューマーは、テーブル値パラメーターの型を指定できます。この情報には、テーブル値パラメーターの型名が含まれます。また、テーブル値パラメーターのユーザー定義テーブル型が接続の現在の既定のスキーマにない場合は、スキーマ名も含まれます。サーバーでサポートされているかどうかに応じて、コンシューマーでは、省略可能なメタデータ情報 (列の順序など) を指定したり、特定の列のすべての行に既定値が設定されるよう指定したりすることもできます。
テーブル値パラメーターを指定するために、コンシューマーは ISSCommandWithParamter::SetParameterInfo を呼び出します。また、必要に応じて ISSCommandWithParameters::SetParameterProperties を呼び出します。テーブル値パラメーターの場合、DBPARAMBINDINFO 構造体の pwszDataSourceType フィールドの値は DBTYPE_TABLE になります。ulParamSize フィールドには ~0 が設定され、長さが不明であることを示します。テーブル値パラメーターの特定のプロパティ (スキーマ名、型名、列の順序、既定の列など) は、ISSCommandWithParameters::SetParameterProperties を使用して設定できます。
テーブル値パラメーターのバインド
テーブル値パラメーターには、任意の行セット オブジェクトを指定できます。プロバイダーは、実行中、このオブジェクトからテーブル値パラメーターを読み取って、サーバーに送信します。
テーブル値パラメーターをバインドするために、コンシューマーは IAccessor::CreateAccessor を呼び出します。テーブル値パラメーターの DBBINDING 構造体の wType フィールドには、DBTYPE_TABLE が設定されます。DBBINDING 構造体の pObject メンバーは NULL ではなく、pObject の iid メンバーは IID_IRowset、またはその他のテーブル値パラメーターの行セット オブジェクト インターフェイスに設定されます。DBBINDING 構造体の残りのフィールドは、ストリームされた BLOB の場合と同じように設定する必要があります。
テーブル値パラメーターと、テーブル値パラメーターに関連付けられる行セット オブジェクトのバインドでは、次の制限が適用されます。
テーブル値パラメーターの行セット列データに許容される状態値は DBSTATUS_S_ISNULL と DBSTATUS_S_OK だけです。DBSTATUS_S_DEFAULT ではエラーが発生し、バインド状態値が DBSTATUS_E_BADSTATUS に設定されます。
テーブル値パラメーターは DBSTATUS_S_DEFAULT 状態でマークできます。有効な値は DBSTATUS_S_DEFAULT と DBSTATUS_S_OK だけです。状態が DBSTATUS_S_DEFAULT に設定された場合、テーブル値パラメーターの値は、空のテーブルに対応します。
テーブル値パラメーターの読み取り専用列 (ID 列または計算列) は、SSPROP_PARAM_TABLE_DEFAULT_COLUMNS プロパティを使って、既定としてマークする必要があります。既定値を持つ列も、特定のテーブル値パラメーターの列データに既定値を使用できるように、SSPROP_PARAM_TABLE_DEFAULT_COLUMNS プロパティで、既定としてマークする必要があります。既定としてマークされた列にバインドされたデータ値は、プロバイダーによって無視されます。
SSPROP_PARAM_TABLE_DEFAULT も設定されない限り、データは、DBPROP_COL_AUTOINCREMENT または SSPROP_COL_COMPUTED が設定された列を想定して、サーバーに送信されます。