Share via


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

SQL Server Native Client はスパース列をサポートしています。SQL Server のスパース列の詳細については、「スパース列の使用」および「列セットの使用」を参照してください。

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

この機能を示すサンプル アプリケーションの詳細については、「SQL Server のサンプルとサンプル データベースのインストールに関する注意点」を参照してください。

スパース列と 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 列のスキーマに準拠している必要があります。

SQLColumns で NULL または '%' の列検索パターンを使用するか (ODBC)、列を制限しない DBSCHEMA_COLUMNS スキーマ行セットを使用して (OLE DB)、テーブルのすべての列のメタデータを取得する。

column_set のメンバでないすべての列について 1 つの行が返されます。テーブルにスパース column_set がある場合は、そのスパース column_set について 1 つの行が返されます。

この場合、column_set のメンバである列のメタデータは返されないことに注意してください。

スパース列かどうか、column_set のメンバかどうかに関係なく、すべての列のメタデータを取得する。この場合、大量の行が返される可能性があります。

記述子フィールド SQL_SOPT_SS_NAME_SCOPE を SQL_SS_NAME_SCOPE_EXTENDED に設定して、SQLColumns を呼び出します (ODBC)。

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

このシナリオは、SQL Server 2008 より前のリリースの SQL Server Native Client を使用するアプリケーションでは使用できません。ただし、そのようなアプリケーションでは、直接システム ビューに対してクエリを実行できます。

column_set のメンバである列についてのみメタデータを取得する。この場合、大量の行が返される可能性があります。

記述子フィールド SQL_SOPT_SS_NAME_SCOPE を SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET に設定して、SQLColumns を呼び出します (ODBC)。

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

このシナリオは、SQL Server 2008 より前のリリースの SQL Server Native Client を使用するアプリケーションでは使用できません。ただし、そのようなアプリケーションでは、システム ビューに対してクエリを実行できます。

列がスパース列かどうかを確認する。

SQLColumns の結果セットの SS_IS_SPARSE 列を調べます (ODBC)。

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

このシナリオは、SQL Server 2008 より前のリリースの 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 列を調べます。または、IColumnsinfo::GetColumnInfo によって返される dwFlags か、IColumnsRowset::GetColumnsRowset によって返される行セットの DBCOLUMNFLAGS を調べます。column_set 列の場合は DBCOLUMNFLAGS_SS_ISCOLUMNSET が設定されます (OLE DB)。

このシナリオは、SQL Server 2008 より前のリリースの 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 Native Client で導入された追加の OLE DB スキーマ行セットを使用したり、SQL_SOPT_SS_NAME_SCOPE で SQLColumns (ODBC) の変更された機能を使用したりすることはできません。

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

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

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

関連項目

その他の技術情報