稀疏列支持 (OLE DB)
本主题提供有关 SQL Server Native Client OLE DB 对稀疏列的支持的信息。 有关稀疏列的详细信息,请参阅SQL Server Native Client 中的稀疏列支持。 相关示例请参阅显示稀疏列的列和目录元数据 (OLE DB)。
OLE DB 语句元数据
从 SQL Server 2008 开始,可以使用新的 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 客户端一致,如下所示:
新架构行集是不可见的,并且在架构行集中没有它们的行。
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 * from table,它将返回不属于稀疏 column_set 成员的所有列,外加一个 XML 列(如果有),其中包含属于稀疏 column_set 成员的所有非 Null 列的值。 |
IOpenRowset::OpenRowset |
使用对相同表的 select * 查询,IOpenRowset::OpenRowset 返回具有与 ICommand::Execute 相同列的行集。 |
ITableDefinition |
对于稀疏列或 column_set 列,该接口没有更改。 必须进行架构修改的应用程序必须直接执行正确的 Transact-SQL。 |