SQL Server Native Client 中的稀疏列支持

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) 未随附:

  • SQL Server 2022 (16.x) 及更高版本
  • SQL Server Management Studio 19 及更高版本

不建议使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)进行新的应用程序开发。

对于新项目,请使用以下驱动程序之一:

对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

SQL Server Native Client 支持稀疏列。 有关 SQL Server 中的稀疏列的详细信息,请参阅使用稀疏列使用列集

有关 SQL Server Native Client 中稀疏列支持的详细信息,请参阅稀疏列支持(ODBC)稀疏列支持(OLE DB)。

稀疏列和 SQL Server Native Client 的用户应用场景

下表汇总了包含稀疏列的 SQL Server Native Client 用户的常见用户方案:

场景 行为
select * from table 或 IOpenRowset::OpenRowset。 返回不是稀疏 column_set 的成员的所有列,以及包含是稀疏 column_set 的成员的所有非空列值的 XML 列 。
按名称引用列。 可以不考虑其稀疏列状态或 column_set 成员身份如何而引用列 。
通过计算的 XML 列访问 column_set 成员列 。 作为稀疏 column_set 的成员的列可以通过按名称选择 column_set 进行访问,并且可通过在 column_set 列中更新 XML 插入和更新值 。

该值必须符合针对 column_set 列的架构 。
通过 SQLColumns 检索表中所有列的元数据,其列搜索模式为 NULL 或“%”(ODBC):或通过没有列限制的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(10.0.x)的版本使用 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(10.0.x)的版本使用 SQL Server Native Client 的应用程序无法实现此方案。 但是,此类应用程序可以查询系统视图。
确定列是否为稀疏列。 查阅 SQLColumns 结果集(ODBC)的SS_IS_SPARSE列。

参考 DBSCHEMA_COLUMNS 架构行集 (OLE DB) 的 SS_IS_SPARSE 列。

从低于 SQL Server 2008(10.0.x)的版本使用 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(10.0.x)的版本使用 SQL Server Native Client 的应用程序无法实现此方案。 但是,此类应用程序可以查询系统视图。
为没有 column_set 的表按 BCP 导入和导出稀疏列 。 与以前版本的 SQL Server Native Client 的行为没有变化。
为有 column_set 的表按 BCP 导入和导出稀疏列 。 导入和导出 column_set 的方式与 XML 相同,也就是说,与 varbinary(max) 相同(如果绑定为 binary 类型)或与 nvarchar(max) 相同(如果绑定为 char 或 wchar 类型)。

是稀疏 column_set 的成员的列不导出为非重复列;它们只导出在 column_set 的值中 。
BCP 的 queryout 行为。 对以前版本的 SQL Server Native Client 中显式命名列的处理没有变化。

如果应用场景涉及在具有不同架构的表之间进行导入和导出,则可能要求特殊处理。

有关 BCP 的详细信息,请参阅本章后面的“针对稀疏列的大容量复制 (BCP) 支持”。

下级客户端行为

下级客户端将只为不属于 SQLColumns 和 DBSCHMA_COLUMNS 的稀疏 column_set 的成员的列返回元数据 。 SQL Server 2008 (10.0.x) Native Client 中引入的其他 OLE DB 架构行集将不可用,也不会通过 SQL_SOPT_SS_NAME_SCOPE 修改 ODBC 中的 SQLColumns。

下级客户端将按名称访问作为稀疏 column_set 的成员的列,并且 column_set 列将可作为 SQL Server 2005 (9.x) 客户端的 XML 列访问。

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

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

如果某一表具有 column_set,则稀疏列不作为非重复列处理 。 所有稀疏列的值都包括在 column_set 值中,后者采用与 XML 列相同的方式导出;也就是说,与 varbinary(max) 相同(如果绑定为 binary 类型)或与 nvarchar(max) 相同(如果绑定为 char 或 wchar 类型)。 在导入时,column_set 值必须符合 column_set 的架构。

对于 queryout 操作,在处理显式引用的列的方式上没有变化 。 column_set 列具有与 XML 列相同的行为,并且稀疏性对于命名稀疏列的处理没有影响 。

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

另请参阅

SQL Server Native Client 编程