次の方法で共有


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 列のスキーマに準拠している必要があります。
列検索パターンが 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 を呼び出します。

このシナリオは、2008 年SQL Serverより前のリリースの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 を呼び出します。

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

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

このシナリオは、2008 年SQL Serverより前のリリースの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)。

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

下位レベルのクライアントは、名前によってスパースcolumn_setのメンバーである列にアクセスでき、column_set2005 クライアントSQL Server XML 列として列にアクセスできます。

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

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

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

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

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

参照

SQL Server Native Client プログラミング