适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
hierarchyid 数据类型是一种长度可变的系统数据类型。 可使用 hierarchyid 表示层次结构中的位置。 hierarchyid 类型的列不会自动表示树。 由应用程序来生成和分配 hierarchyid 值,这样行之间的所需关系就会反映在值中。
hierarchyid 数据类型的值表示树层次结构中的位置。 hierarchyid 的值具有以下属性:
极其紧凑:表示具有 n 个节点的树中的节点所需的平均位数取决于平均扇出量(节点的子级数)。 对于小型扇出(0-7),大小约为 6 * logA n 位,其中 A 是平均扇出量。 组织层次结构中的节点为 100,000 人,平均扇出 6 个级别需要大约 38 位。 存储时,此值向上舍入为 40 位,即 5 字节。
比较是深度优先顺序:给定两个 hierarchyid 值
a,ba<b这意味着在树的深度优先遍历中出现 b。 hierarchyid 数据类型的索引按深度优先顺序排序,在深度优先遍历中相邻的节点的存储位置也相邻。 例如,一条记录的子级的存储位置与该记录的存储位置是相邻的。 有关详细信息,请参阅分层数据(SQL Server)。支持任意插入和删除:通过使用 GetDescendant 方法,始终可以在任何给定节点的右侧、任何给定节点的左侧或任意两个同级节点之间生成同级节点。 在层次结构中插入或删除任意数目的节点时,该比较属性保持不变。 大多数插入和删除操作都保留了紧凑性属性。 但是,在两个节点之间插入会生成具有稍微精简表示形式的 hierarchyid 值。
编码限制为 892 字节: 因此,在其表示形式中具有过多级别以容纳 892 字节的节点不能由 hierarchyid 类型表示。
hierarchyid 类型可用于公共语言运行时 (CLR) 客户端作为SqlHierarchyId数据类型。
Remarks
hierarchyid 类型对层次结构树中有关单个节点的信息进行逻辑编码的方法是:对从树的根目录到该节点的路径进行编码。 这种路径在逻辑上表示为一个在根之后被访问的所有子级的节点标签序列。 表示形式以一条斜杠开头,只访问根的路径由单条斜杠表示。 对于根以下的各级,各标签编码为由点分隔的整数序列。
子级之间的比较就是按字典顺序比较由点分隔的整数序列。 每个级别后面紧跟着一个斜杠。 因此斜杠将父级与其子级分隔开。 例如,以下是长度分别为 1 级、2 级、2 级、3 级和 3 级的有效 hierarchyid 路径:
//1//0.3.-7//1/3//0.1/0.2/
可在任何位置插入节点。 在之后 /1/2/ 插入的节点,但之前 /1/3/ 可以表示为 /1/2.5/。 在逻辑表示形式为负数之前 0 插入的节点。 例如,以前 /1/1/ 出现的节点可以表示为 /1/-1/. 节点不能有前导零。 例如, /1/1.1/ 有效,但 /1/1.01/ 无效。 为了避免错误,请使用 GetDescendant 方法插入节点。
数据类型转换
hierarchyid 数据类型可按如下方法转换为其他数据类型:
使用 ToString 方法将 hierarchyid 值转换为逻辑表示形式 作为 nvarchar(4000) 数据类型。
使用 CSharp 和 Write 使用读取(数据库引擎)将 hierarchyid 转换为 varbinary。
若要通过 SOAP 传输 hierarchyid 参数,请先将它们强制转换为字符串。
升级数据库
将数据库升级到较新版本的 SQL Server 时,会自动安装新的程序集和 hierarchyid 数据类型。 升级顾问规则将检测具有冲突名称的任何用户类型或程序集。 升级顾问建议重命名任何冲突程序集,并重命名任何冲突类型,或使用代码中的两部分名称来引用该预先存在的用户类型。
如果数据库升级检测到具有冲突名称的用户程序集,它会自动重命名该程序集并将数据库置于可疑模式。
如果在升级过程中存在具有冲突名称的用户类型,则不会采取特殊步骤。 升级后,旧用户类型和新系统类型都存在。 用户类型只能通过两部分名称使用。
在复制的表中使用 hierarchyid 列
可在任何复制的表中使用类型为 hierarchyid 的列。 应用程序的要求取决于复制是单向的还是双向的,同时还取决于所用 SQL Server 的版本。
单向复制
单向复制包括快照复制、事务复制和合并复制,其中未在订阅服务器上进行更改。 在单向复制过程中如何使用层次结构列取决于订阅服务器所运行的 SQL Server 版本。
SQL Server 发布服务器可以将 hierachyid 列复制到相同版本的 SQL Server 订阅服务器,而无须考虑任何特殊事项。
SQL Server 发布服务器必须将 hierarchyid 列转换为运行 SQL Server Compact 或早期版本的 SQL Server 的订阅服务器。 SQL Server Compact 和早期版本的 SQL Server 不支持 hierarchyid 列。 如果使用其中一个版本,仍可将数据复制到订阅服务器。 为此,必须设置架构选项或发布兼容性级别(如果是合并复制),从而使列能够转换为兼容的数据类型。
这两种情况均支持列筛选。 这包括筛选出 hierarchyid 列。 只要筛选器不包含 hierarchyid 列,就支持行筛选。
双向复制
双向复制包括带更新订阅的事务复制、对等事务复制,以及在订阅服务器上进行更改的合并复制。 在复制操作中,可以配置一个包含 hierarchyid 列的表以进行双向复制。 请注意以下要求和事项。
发布服务器和所有订阅服务器必须在 SQL Server 2016 (13.x) 或更高版本上运行相同的版本。
复制会将数据复制为字节,并且不执行任何验证以确保层次结构的完整性。
在源(订阅服务器或发布服务器上)所做的更改复制到目标时,不会保留更改的层次结构。
hierarchyid 列的值可以在所有数据库中具有相同的二进制表示形式。 当应用程序逻辑独立为不同的实体生成相同的 hierarchyid 时,双向复制中可能会发生冲突。 因此,在发布服务器和订阅服务器上可以生成相同的值,但该值可以应用于不同的行。 复制不会检查此条件,并且没有内置方法来对 hierarchyid 列值进行分区,因为存在
IDENTITY列。 应用程序必须使用约束或其他机制来避免这类未检测到的冲突。在订阅服务器上插入的行可能是孤立的。 插入行的父行可能在发布服务器上删除。 将订阅服务器上的行插入到发布服务器上时,这将导致出现未检测到的冲突。
列筛选器无法筛选出不可为 null 的 hierarchyid 列。 从订阅服务器插入失败,因为发布服务器上的 hierarchyid 列没有默认值。
只要筛选器不包含 hierarchyid 列,就支持行筛选。