次の方法で共有


SQL Server Native Client におけるスパース列のサポート

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) は同梱されていません。

  • SQL Server 2022 (16.x) 以降のバージョン
  • SQL Server Management Studio (19 以降のバージョン) の場合

SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。

新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。

SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、この「サポート ライフサイクルの例外」を参照してください。

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

SQL Server Native Client でのスパース列のサポートの詳細については、「 Sparse Columns Support (ODBC) 」および「 Sparse Columns Support (OLE DB)」を参照してください。

スパース列と SQL Server Native Client のユーザー シナリオ

次の表は、スパース列を持つ SQL Server Native Client ユーザーの一般的なユーザー シナリオをまとめたものです。

シナリオ 動作
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 列のスキーマに準拠している必要があります。
列検索パターンが NULL または '%' (ODBC) である SQLColumns を使用して、テーブル内のすべての列のメタデータを取得します。または、列制限のないDBSCHEMA_COLUMNSスキーマ行セット (OLE DB) を使用します。 column_set のメンバーでないすべての列について 1 つの行が返されます。 テーブルにスパース column_set がある場合は、そのスパースについて 1 つの行が返されます。

この場合、column_set のメンバーである列のメタデータは返されないことに注意してください。
スパース列かどうか、column_set のメンバーかどうかに関係なく、すべての列のメタデータを取得する。 この場合、大量の行が返される可能性があります。 記述子フィールドのSQL_SOPT_SS_NAME_SCOPEをSQL_SS_NAME_SCOPE_EXTENDEDに設定し、 SQLColumns (ODBC) を呼び出します。

DBSCHEMA_COLUMNS_EXTENDED スキーマ行セット (OLE DB) の IDBSchemaRowset::GetRowset を呼び出します。

このシナリオは、SQL Server 2008 (10.0.x) より前のリリースの SQL Server Native Client を使用するアプリケーションからは実行できません。 ただし、このようなアプリケーションでは、システム ビューに直接クエリを実行できます。
column_set のメンバーである列についてのみメタデータを取得する。 この場合、大量の行が返される可能性があります。 記述子フィールドSQL_SOPT_SS_NAME_SCOPEをSQL_SS_NAME_SCOPE_SPARSE_COLUMN_SETに設定し、SQLColumns (ODBC) を呼び出します。

DBSCHEMA_SPARSE_COLUMN_SET スキーマ行セット (OLE DB) の IDBSchemaRowset::GetRowset を呼び出します。

このシナリオは、SQL Server 2008 (10.0.x) より前のリリースの SQL Server Native Client を使用するアプリケーションからは実行できません。 ただし、そのようなアプリケーションでは、システム ビューに対してクエリを実行できます。
列がスパース列かどうかを確認する。 SQLColumns 結果セット (ODBC) の SS_IS_SPARSE 列を参照してください。

DBSCHEMA_COLUMNS スキーマ行セットの SS_IS_SPARSE 列を調べます (OLE DB)。

このシナリオは、SQL Server 2008 (10.0.x) より前のリリースの SQL Server Native Client を使用するアプリケーションからは実行できません。 ただし、そのようなアプリケーションでは、システム ビューに対してクエリを実行できます。
列が column_set かどうかを確認する。 SQLColumns 結果セットの SS_IS_COLUMN_SET 列を参照してください。 または、SQL Server 固有の列属性 SQL_CA_SS_IS_COLUMN_SET (ODBC) を参照してください。

DBSCHEMA_COLUMNS スキーマ行セットの SS_IS_COLUMN_SET 列を調べます。 または、IColumnsRowset::GetColumnsRowset によって返された行セットの IColumnsinfo::GetColumnInfo または DBCOLUMNFLAGS によって返された dwFlags を確認します。 column_set列の場合、DBCOLUMNFLAGS_SS_ISCOLUMNSETが設定されます (OLE DB)。

このシナリオは、SQL Server 2008 (10.0.x) より前のリリースの SQL Server Native Client を使用するアプリケーションからは実行できません。 ただし、そのようなアプリケーションでは、システム ビューに対してクエリを実行できます。
column_set を含まないテーブルに対して BCP でスパース列をインポートおよびエクスポートする。 以前のバージョンの SQL Server Native Client からの動作に変更はありません。
column_set を含むテーブルに対して BCP でスパース列をインポートおよびエクスポートする。 column_set は、XML と同じ方法でインポートおよびエクスポートされます。つまり、バイナリ型としてバインドされている場合は varbinary(max) として、char 型または wchar 型としてバインドされている場合は nvarchar (max) としてインポートおよびエクスポートされます。

スパース column_set のメンバーである列は個別の列としてはエクスポートされず、column_set の値でのみエクスポートされます。
BCP の queryout の動作。 以前のバージョンの SQL Server Native Client からの明示的な名前付き列の処理に変更はありません。

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

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

下位クライアントの動作

下位クライアントでは、SQLColumns および DBSCHMA_COLUMNS でメタデータが返されるのは、スパース column_set のメンバーでない列のみです。 SQL Server 2008 (10.0.x) Native Client で導入された追加の OLE DB スキーマ行セットは使用できません。また、SQL_SOPT_SS_NAME_SCOPEを介して ODBC の SQLColumns に対する変更も行われません。

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

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

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

テーブルに 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 列を参照するテーブルのビューを定義して、そのビューを使用してインポート操作を行う必要があります。

参照

SQL Server Native Client プログラミング