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 的成员的所有列,以及包含是稀疏 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) 。 使用早于 2008 SQL Server 版本的 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) 。 使用早于 2008 SQL Server 版本的 SQL Server Native Client 的应用程序无法实现此方案。 但是,此类应用程序可以查询系统视图。 |
确定列是否为稀疏列。 | 请参阅 SQLColumns 结果集 (ODBC) SS_IS_SPARSE列。 参考 DBSCHEMA_COLUMNS 架构行集 (OLE DB) 的 SS_IS_SPARSE 列。 使用早于 2008 SQL Server 版本的 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 列,将设置 DBCOLUMNFLAGS_SS_ISCOLUMNSET (OLE DB)。使用早于 2008 SQL Server 版本的 SQL Server Native Client 的应用程序无法实现此方案。 但是,此类应用程序可以查询系统视图。 |
为没有 column_set 的表按 BCP 导入和导出稀疏列。 |
SQL Server Native Client的早期版本的行为没有变化。 |
为具有 column_set 的表按 BCP 导入和导出稀疏列。 |
导入column_set 和导出的方式与 XML 相同;也就是说,就像绑定到二进制类型一样varbinary(max) ,或者就像绑定为 char 或 wchar 类型一样nvarchar(max) 。是稀疏 column_set 的成员的列不导出为非重复列;它们只导出在 column_set 的值中。 |
针对 BCP 的 queryout 行为。 |
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)
,或者 nvarchar(max)
绑定为 char
或 wchar 类型) 。 在导入时,column_set
值必须符合 column_set
的架构。
对于 queryout
操作,在处理显式引用的列的方式上没有变化。 column_set
列具有与 XML 列相同的行为,并且稀疏性对于命名稀疏列的处理没有影响。
但是,如果 queryout
用于导出并且您引用的稀疏列属于按名称的稀疏列集的成员,则不能执行向类似结构表的直接导入。 这是因为 BCP 使用与选择 * 操作一致的元数据进行导入,并且无法将成员列与此元数据匹配 column_set
。 若要单独导入 column_set
成员列,您必须对引用所需 column_set
列的表定义一个视图,并且必须使用该视图执行导入操作。