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

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

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

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

SQL Server Native Clientでのスパース列のサポートの詳細については、「スパース列のサポート (ODBC)」および「スパース列のサポート (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) ネイティブ クライアントで導入された追加の OLE DB スキーマ行セットは使用できず、ODBC の SQLColumns に対する変更はSQL_SOPT_SS_NAME_SCOPE経由で行われません。

下位クライアントでは、スパース 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 プログラミング