OLE DB Driver for SQL Server のスパース列のサポート
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
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 列を参照するテーブルのビューを定義して、そのビューを使用してインポート操作を行う必要があります。