コンシューマーはテーブル値パラメーターに任意の行セット オブジェクトを提供できますが、一般的な行セット オブジェクトはバックエンド データ ストアに対して実装されるため、パフォーマンスが制限されます。 このため、SQL Server Native Client OLE DB Provider を使用すると、コンシューマーはメモリ内データの上に特殊な行セット オブジェクトを作成できます。 この特別なメモリ内行セット オブジェクトは、テーブル値パラメーター行セットと呼ばれる新しい COM オブジェクトです。 これは、パラメーター セットと同様の機能を提供します。
テーブル値パラメーター行セット オブジェクトは、複数のセッション レベルインターフェイスを介して入力パラメーターに対してコンシューマーによって明示的に作成されます。 テーブル値パラメーターごとに、テーブル値パラメーター行セット オブジェクトのインスタンスが 1 つあります。 コンシューマーは、既に知られているメタデータ情報を提供するか (静的シナリオ)、またはプロバイダー インターフェイス (動的シナリオ) を介して検出することによって、テーブル値パラメーター行セット オブジェクトを作成できます。 次のセクションでは、これら 2 つのシナリオについて説明します。
静的シナリオ
型情報がわかっている場合、コンシューマーは ITableDefinitionWithConstraints::CreateTableWithConstraints を使用して、テーブル値パラメーターに対応するテーブル値パラメーター行セット オブジェクトをインスタンス化します。
guid フィールド (pTableID パラメーター) には、特殊な GUID (CLSID_ROWSET_TVP) が含まれています。 pwszName メンバーには、コンシューマーがインスタンス化するテーブル値パラメーター型の名前が含まれています。 eKind フィールドはDBKIND_GUID_NAMEに設定されます。 この名前は、ステートメントがアドホック SQL の場合に必要です。プロシージャ呼び出しの場合、名前は省略可能です。
集計の場合、コンシューマーは制御する IUnknown と共に pUnkOuter パラメーターを渡します。
テーブル値パラメーター行セット オブジェクトのプロパティは読み取り専用であるため、コンシューマーは rgPropertySets でプロパティを設定する必要はありません。
各 DBCOLUMNDESC 構造体の rgPropertySets メンバーの場合、コンシューマーは各列に追加のプロパティを指定できます。 これらのプロパティは、DBPROPSET_SQLSERVERCOLUMN プロパティ セットに属します。 各列の計算設定と既定の設定を指定できます。 また、null 値の許容や ID など、既存の列プロパティもサポートされています。
テーブル値パラメーター行セット オブジェクトから対応する情報を取得するために、コンシューマーは IRowsetInfo::GetProperties を使用します。
各列の null、一意、計算済み、および更新状態に関する情報を取得するために、コンシューマーは IColumnsRowset::GetColumnsRowset または IColumnsInfo::GetColumnInfo を使用します。 これらのメソッドは、各テーブル値パラメーター行セット列に関する詳細情報を提供します。
コンシューマーは、テーブル値パラメーターの各列の型を指定します。 これは、SQL Server でテーブルを作成するときに列を指定する方法と似ています。 コンシューマーは、 ppRowset 出力パラメーターを使用して、SQL Server Native Client OLE DB Provider からテーブル値パラメーター行セット オブジェクトを取得します。
動的シナリオ
コンシューマーに型情報がない場合は、IOpenRowset::OpenRowset を使用して、テーブル値パラメーター行セット オブジェクトをインスタンス化する必要があります。 コンシューマーがプロバイダーに提供する必要があるのは型名です。
このシナリオでは、プロバイダーは、コンシューマーの代わりに、テーブル値パラメーター行セット オブジェクトに関する型情報をサーバーから取得します。
pTableID パラメーターと pUnkOuter パラメーターは、静的なシナリオのように設定する必要があります。 次に、SQL Server Native Client OLE DB Provider は、サーバーから型情報 (列情報と制約) を取得し、 ppRowset パラメーターを使用してテーブル値パラメーター行セット オブジェクトを返します。 この操作にはサーバーとの通信が必要であるため、静的なシナリオと同様に実行されません。 動的なシナリオは、パラメーター化されたプロシージャ呼び出しでのみ機能します。
こちらもご覧ください
Table-Valued パラメーター (OLE DB)
Table-Valued パラメーターの使用 (OLE DB)