テーブル値パラメーターの行セットの作成
コンシューマーはテーブル値パラメーターに任意の行セット オブジェクトを使用できますが、通常の行セット オブジェクトはバックエンドのデータ ストアに対して実装されるため、パフォーマンスが制限されます。 このため、SQL Server Native Client OLE DB プロバイダーでは、コンシューマーがメモリ内データの上位に特殊な行セット オブジェクトを作成できます。 この特殊なメモリ内の行セット オブジェクトは、テーブル値パラメーターの行セットと呼ばれる新しい 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 プロバイダーからテーブル値パラメーターの行セット オブジェクトを取得します。
動的なシナリオ
コンシューマーで型情報がわからない場合は、IOpenRowset::OpenRowset を使用してテーブル値パラメーターの行セット オブジェクトのインスタンスを作成する必要があります。 すべてのコンシューマーは、プロバイダーに型名を知らせる必要があります。
このシナリオでは、プロバイダーがコンシューマーに代わって、テーブル値パラメーターの行セット オブジェクトに関する型情報をサーバーから取得します。
pTableID パラメーターおよび pUnkOuter パラメーターは、静的なシナリオと同様に設定します。 その後、SQL Server Native Client OLE DB プロバイダーが型情報 (列情報と制約) をサーバーから取得し、ppRowset パラメーターを使用してテーブル値パラメーターの行セット オブジェクトを返します。 この操作にはサーバーとの通信が必要になるため、静的なシナリオよりもパフォーマンスが低くなります。動的なシナリオは、パラメーター化されたプロシージャ呼び出しでのみ動作します。