SQL Server Native Client でのテーブル値パラメーター行セットの作成
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
コンシューマーはテーブル値パラメーターに任意の行セット オブジェクトを使用できますが、通常の行セット オブジェクトはバックエンドのデータ ストアに対して実装されるため、パフォーマンスが制限されます。 このため、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 パラメーターを使用してテーブル値パラメーター行セット オブジェクトを返します。 この操作にはサーバーとの通信が必要であるため、静的なシナリオと同様に実行されません。 動的なシナリオは、パラメーター化されたプロシージャ呼び出しでのみ動作します。