次の方法で共有


テーブル値パラメータの行セットの作成

コンシューマはテーブル値パラメータに任意の行セット オブジェクトを使用できますが、通常の行セット オブジェクトはバックエンドのデータ ストアに対して実装されるため、パフォーマンスが制限されます。このため、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 パラメータを使用してテーブル値パラメータの行セット オブジェクトを返します。この操作にはサーバーとの通信が必要になるため、静的なシナリオよりもパフォーマンスが低くなります。動的なシナリオは、パラメータ化されたプロシージャ呼び出しでのみ動作します。