OLE DB Driver for SQL Server のスパース列のサポート

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

OLE DB ドライバーのダウンロード

OLE DB Driver for SQL Server では、スパース列がサポートされています。 SQL Server でのスパース列の詳細については、スパース列の使用に関するページと「列セットの使用」を参照してください。

OLE DB Driver for SQL Server でのスパース列のサポートの詳細については、「スパース列のサポート (OLE DB)」を参照してください。

スパース列と OLE DB Driver for SQL Server のユーザー シナリオ

スパース列を使用する OLE DB Driver for SQL Server ユーザーの一般的なユーザー シナリオの概要を次の表に示します。

シナリオ 動作
select * from table または IOpenRowset::OpenRowset。 スパース column_set のメンバーでないすべての列と、スパース column_set のメンバーであるすべての NULL 以外の列の値を含む XML 列が返されます。
名前で列を参照する。 スパース列かどうか、column_set のメンバーであるかどうかに関係なく、列を参照できます。
XML 計算列を通じて column_set メンバー列にアクセスする。 スパース column_set のメンバーである列に、名前で column_set を選択してアクセスし、column_set 列の XML を更新して値を挿入および更新できます。

値は、column_set 列のスキーマに準拠している必要があります。
列を制限しない DBSCHEMA_COLUMNS スキーマ行セットを使用して (OLE DB)、テーブルのすべての列のメタデータを取得する。 column_set のメンバーでないすべての列について 1 つの行が返されます。 テーブルにスパース column_set がある場合は、そのスパースについて 1 つの行が返されます。

この場合、column_set のメンバーである列のメタデータは返されないことに注意してください。
スパース列かどうか、column_set のメンバーかどうかに関係なく、すべての列のメタデータを取得する。 この場合、大量の行が返される可能性があります。 DBSCHEMA_COLUMNS_EXTENDED スキーマ行セットに対して IDBSchemaRowset::GetRowset を呼び出します。
column_set のメンバーである列についてのみメタデータを取得する。 この場合、大量の行が返される可能性があります。 DBSCHEMA_SPARSE_COLUMN_SET スキーマ行セットに対して IDBSchemaRowset::GetRowset を呼び出します。
列がスパース列かどうかを確認する。 DBSCHEMA_COLUMNS スキーマ行セットの SS_IS_SPARSE 列を調べます (OLE DB)。
列が column_set かどうかを確認する。 DBSCHEMA_COLUMNS スキーマ行セットの SS_IS_COLUMN_SET 列を調べます。 または、IColumnsRowset::GetColumnsRowset によって返された行セットの IColumnsinfo::GetColumnInfo または DBCOLUMNFLAGS によって返された dwFlags を確認します。 column_set 列の場合は DBCOLUMNFLAGS_SS_ISCOLUMNSET が設定されます。
column_set を含まないテーブルに対して BCP でスパース列をインポートおよびエクスポートする。 OLE DB Driver for SQL Server の以前のバージョンから動作は変更されていません。
column_set を含むテーブルに対して BCP でスパース列をインポートおよびエクスポートする。 column_set は、XML と同じ方法でインポートおよびエクスポートされます。つまり、バイナリ型としてバインドされている場合は varbinary(max) として、char 型または wchar 型としてバインドされている場合は nvarchar (max) としてインポートおよびエクスポートされます。

スパース column_set のメンバーである列は個別の列としてはエクスポートされず、column_set の値でのみエクスポートされます。
BCP の queryout の動作。 明示的に指定された列の処理は、OLE DB Driver for SQL Server の以前のバージョンから変更されていません。

スキーマが異なる列の間のインポートおよびエクスポートを含むシナリオでは、特別な処理が必要になる場合があります。

BCP の詳細については、後の「一括コピー (BCP) によるスパース列のサポート」を参照してください。

下位クライアントの動作

下位クライアントでは、SQLColumns および DBSCHMA_COLUMNS でメタデータが返されるのは、スパース column_set のメンバーでない列のみです。

下位クライアントでは、スパース column_set のメンバーである列に名前でアクセスできます。SQL Server 2005 (9.x) クライアントでは、XML 列として column_set 列にアクセスできます。

一括コピー (BCP) によるスパース列のサポート

OLE DB の BCP API には、スパース列や column_set 機能のための変更はありません。

テーブルに column_set がある場合、スパース列は個別の列として処理されません。 すべてのスパース列の値は column_set の値に含まれ、XML 列と同じ方法でエクスポートされます。つまり、バイナリ型としてバインドされている場合は varbinary(max) として、char 型または wchar 型としてバインドされている場合は nvarchar(max) として、エクスポートされます。 インポートの際には、column_set の値が column_set のスキーマに準拠している必要があります。

queryout の操作については、明示的に参照されている列の処理方法は変更されていません。 column_set 列の動作は XML 列と同じで、名前で参照されているスパース列の処理には、列がスパース列であることの影響はありません。

ただし、queryout をエクスポートに使用する場合に、スパース列セットのメンバーであるスパース列を名前で参照すると、同じ構造のテーブルへの直接インポートができなくなります。 これは、BCP では select * 操作と一貫したメタデータがインポートのために使用され、そのメタデータを column_set メンバー列と対応させることはできないからです。 column_set メンバー列を個別にインポートするには、目的の column_set 列を参照するテーブルのビューを定義して、そのビューを使用してインポート操作を行う必要があります。

参照

OLE DB Driver for SQL Server