SQL Server Native Client 中的稀疏列支持

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

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件附带的 SQLNCLI (版本 2012 到 2019) ,请参阅此支持生命周期异常

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, (ODBC) 调用 SQLColumns

DBSCHEMA_COLUMNS_EXTENDED架构行集调用 IDBSchemaRowset::GetRowset (OLE DB) 。

使用早于 SQL Server 2008 (10.0.x) 版本的 SQL Server Native Client 的应用程序无法实现此方案。 但是,此类应用程序可以直接查询系统视图。
只为是 column_set 成员的列检索元数据 。 此操作可能返回大量的行。 将描述符字段SQL_SOPT_SS_NAME_SCOPE设置为SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET,并 (ODBC) 调用 SQLColumns。

DBSCHEMA_SPARSE_COLUMN_SET架构行集调用 IDBSchemaRowset::GetRowset (OLE DB) 。

使用早于 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列。 或者,请参阅 ODBC) SQL_CA_SS_IS_COLUMN_SET (特定列属性SQL Server。

参考 DBSCHEMA_COLUMNS 架构行集的 SS_IS_COLUMN_SET 列。 或者,请参阅由 IColumnsRowset::GetColumnsRowset 返回的行集中的 IColumnsinfo::GetColumnInfo 或 DBCOLUMNFLAGS 返回的 dwFlags 。 对于 column_set 列,将 (OLE DB) 设置DBCOLUMNFLAGS_SS_ISCOLUMNSET。

使用早于 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 编程