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成员的所有列,以及一个 XML 列,该列包含属于稀 column_set疏成员的所有非 null 列的值。
按名称引用列。 无论其稀疏列状态或 column_set 成员身份如何,都可以引用该列。
通过计算的 XML 列访问 column_set 成员列。 可以通过选择column_set名称来访问属于稀疏column_set的列,并且可以通过更新列中的 XML column_set 来插入和更新值。

该值必须符合列的 column_set 架构。
通过 SQLColumns 检索表中所有列的元数据,其列搜索模式为 NULL 或“%”(ODBC):或通过没有列限制的DBSCHEMA_COLUMNS架构行集(OLE DB)。 返回非成员的所有列的 column_set行。 如果表具有稀疏 column_set,将为其返回一行。

请注意,这不会返回属于 a 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 架构行集 (OLE DB) 的 SS_IS_SPARSE 列。

从低于 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 的应用程序无法实现此方案。 但是,此类应用程序可以查询系统视图。
BCP 为没有 column_set的表导入和导出稀疏列。 与以前版本的 SQL Server Native Client 的行为没有变化。
对于具有 /> 的表,按 BCP 导入和导出稀疏列。 导入column_set和导出的方式与 XML 相同;也就是说,就像作为二进制类型绑定一样varbinary(max),或者就像绑定为charwchar 类型一样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 该列可以作为 XML 列访问到 SQL Server 2005 客户端。

针对稀疏列的大容量复制 (BCP) 支持

对于稀疏列或 column_set 功能,ODBC 或 OLE DB 中的 BCP API 没有更改。

如果表有一个 column_set,则稀疏列不会作为非重复列进行处理。 所有稀疏列的值column_set都包含在值中,它以与 XML 列相同的方式导出;也就是说,就像作为二进制类型绑定一样varbinary(max),或者就像绑定为charwchar 类型一样nvarchar(max))。 在导入时, column_set 该值必须符合 . column_set的架构。

对于 queryout 作,不会更改显式引用列的处理方式。 column_set 列的行为与 XML 列相同,稀疏性对命名稀疏列的处理没有影响。

但是,如果 queryout 用于导出,并且引用稀疏列是按名称设置的稀疏列的成员,则不能直接导入到类似结构化的表中。 这是因为 BCP 使用与导入 的 select * 作一致的元数据,并且无法与此元数据匹配 column_set 成员列。 若要单独导入 column_set 成员列,必须在引用所需 column_set 列的表上定义视图,并且必须使用视图执行导入作。

另请参阅

SQL Server Native Client 编程