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