次の方法で共有


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

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

SQL Server Native Client でのスパース列のサポートの詳細については、「 Sparse Columns Support (ODBC) 」および「 Sparse Columns Support (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のメンバーではないすべての列の行を返します。 テーブルにスパース column_setがある場合は、そのテーブルに対して行が返されます。

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

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 列を調べます。 または、IColumnsRowset::GetColumnsRowset によって返された行セットの IColumnsinfo::GetColumnInfo または DBCOLUMNFLAGS によって返された dwFlags を確認します。 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の値でのみエクスポートされます。
queryout BCP の動作。 以前のバージョンの 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_set 列には SQL Server 2005 クライアントの XML 列としてアクセスできます。

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

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

テーブルに column_setがある場合、スパース列は個別の列として処理されません。 すべてのスパース列の値は、XML 列と同じ方法でエクスポートされるcolumn_setの値に含まれます。つまり、バイナリ型としてバインドされている場合は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 プログラミング