层次结构数据定义为一组通过层次结构关系互相关联的数据项。 在层次结构关系中,一个数据项是另一个项的父级或子级。
sql server2008开始内置的 hierarchyid 数据类型使存储和查询层次结构数据变得更为容易。hierarchyid 其实是 CLR 数据类型。
废话不多说,看不明白就实际操作一把,然后再回过头来理解。
下面先创建一个表,并插入一些数据:
create table RoleMan
(
NodeId hierarchyid not null,
RoleId int not null,
RoleName nvarchar(32) not null,
Par_NodeId as NodeId.GetLevel() -- GetLevel()用于确定当前层次的深度(级别),最顶层(根节点)为0,然后依次加1。
)
go
insert into RoleMan(NodeId,RoleId,RoleName)
select '/1/','1','超级管理员' union
select '/1/1/','2','管理员A' union
select '/1/2/','3','管理员B' union
select '/1/1/1/','4','用户AA' union
select '/1/1/2/','5','用户AB' union
select '/1/2/1/','6','用户BA' union
select '/1/2/2/','7','用户BB'
go
select *,
NodeId.ToString() NodeId_Path -- 因为 hierarchyid 类型的值是以16进制表示的,这里把他转换为字符串
from RoleMan
查询指定节点的祖先节点:
-- 查询指定节点的祖先节点
declare @NodeId hierarchyid
select @NodeId=NodeId
from RoleMan
where RoleId=5
select *,NodeId.ToString() NodeId_Path
from RoleMan
where @NodeId.IsDescendantOf(NodeId)=1 -- IsDescendantOf(NodeId),判断指定节点是否是另一个节点的后代,如果是,则返回1