SQL Server Native Client (OLE DB) 中的稀疏列支持

适用于: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 OLE DB 提供程序(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 此后请切换到新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server

本主题提供有关SQL Server Native Client OLE DB 对稀疏列的支持的信息。 有关稀疏列的详细信息,请参阅 SQL Server Native Client 中的稀疏列支持。 例如,请参阅显示稀疏列的列和目录元数据 (OLE DB)

OLE DB 语句元数据

从 SQL Server 2008 (10.0.x) 开始,可以使用新的 DBCOLUMNFLAGS 标记值 DBCOLUMNFLAGS_SS_ISCOLUMNSET。 应当为是 column_set 值的列设置该值 。 可以通过 IColumnsInfo::GetColumnsInfo 的 dwFlags 参数和 IColumnsRowset::GetColumnsRowset 返回的行集的 DBCOLUMN_FLAGS 列来检索 DBCOLUMNFLAGS 标志。

OLE DB 目录元数据

其他两个特定于 SQL Server 的列已添加到 DBSCHEMA_COLUMNS 中。

列名称 数据类型 值/注释
SS_IS_SPARSE DBTYPE_BOOL 如果该列是稀疏列,它将具有值 VARIANT_TRUE;否则,为 VARIANT_FALSE。
SS_IS_COLUMN_SET DBTYPE_BOOL 如果该列是稀疏 column_set 列,则它具有值 VARIANT_TRUE;否则,为 VARIANT_FALSE 。

还添加了其他两个架构行集。 这些行集具有与 DBSCHEMA_COLUMNS 相同的结构,但返回不同内容。 不管 column_set 成员身份是什么,DBSCHEMA_COLUMNS_EXTENDED 都将返回所有列 。 DBSCHEMA_SPARSE_COLUMN_SET 仅返回属于稀疏 column_set 的成员的列 。

OLE DB DataTypeCompatibility 行为

在 DataTypeCompatibility=80 时(在连接字符串中)的行为与 SQL Server 2000 (8.x) 客户端一致,如下所示:

  • 新架构行集是不可见的,并且在架构行集中没有它们的行。

  • COLUMNS 行集中的新列是不可见的。

  • 不为 column_set 列设置 DBCOLUMNFLAGS_SS_ISCOLUMNSET 。

  • 为 column_set 列设置 DBCOMPUTEMODE_NOTCOMPUTED 。

OLE DB 对稀疏列的支持

在 SQL Server Native Client 中修改了以下 OLE DB 接口以支持稀疏列:

类型或成员函数 说明
IColumnsInfo::GetColumnsInfo 为 dwFlags 中的 column_set 列设置了新的 DBCOLUMNFLAGS 标记值 DBCOLUMNFLAGS_SS_ISCOLUMNSET 。

为 column_set 列设置了 DBCOLUMNFLAGS_WRITE 。
IColumsRowset::GetColumnsRowset 为 DBCOLUMN_FLAGS 中的 column_set 列设置了新的 DBCOLUMNFLAGS 标记值 DBCOLUMNFLAGS_SS_ISCOLUMNSET 。

对于 column_set 列,将 DBCOLUMN_COMPUTEMODE 设置为 DBCOMPUTEMODE_DYNAMIC 。
IDBSchemaRowset::GetSchemaRowset DBSCHEMA_COLUMNS 返回两个新列:SS_IS_COLUMN_SET 和 SS_IS_SPARSE。

DBSCHEMA_COLUMNS 仅返回不属于 column_set 成员的列 。

已添加两个新架构行集:不管 column_set 成员身份的稀疏性如何,DBSCHEMA_COLUMNS_EXTENDED 都将返回所有列 。 DBSCHEMA_SPARSE_COLUMN_SET 仅返回属于 column_set 成员的列 。 这些新行集具有与 DBSCHEMA_COLUMNS 相同的列和限制。
IDBSchemaRowset::GetSchemas IDBSchemaRowset::GetSchemas 将新行集 DBSCHEMA_COLUMNS_EXTENDED 和 DBSCHEMA_SPARSE_COLUMN_SET 的 GUID 包括在可用架构行集的列表中。
ICommand::Execute 如果使用 select * fromtable,它将返回不属于稀疏 column_set 成员的所有列,外加一个 XML 列(如果有),其中包含属于稀疏 column_set 成员的所有非 NULL 列的值。
IOpenRowset::OpenRowset IOpenRowset::OpenRowset 通过对同一表执行 select * 查询返回与 ICommand::Execute 具有相同列的行集。
ITableDefinition 对于稀疏列或 column_set 列,该接口没有更改 。 必须进行架构修改的应用程序必须直接执行正确的 Transact-SQL。

另请参阅

SQL Server Native Client (OLE DB)