首页 > 技术文章 > 如何在SqlServer中使用层级节点类型hierarchyid

w821759016 2019-11-12 17:28 原文

Sql Server2008开始新增的 hierarchyid 数据类型使存储和查询层次结构数据变得更为简单。

为了使用这个类型,笔者在此进行简单记录,同时为需要的朋友提供一个简单的参考。

--获取层级
select Dep.GetLevel() Level from UserInfo

--查看所有的下级节点
select Dep.ToString() from UserInfo where Dep.IsDescendantOf('/11/1/')=1

--查看下属一级的所有节点(下属2级则改为2,三级可改为3,返回的数据只包含一层)
select Dep.ToString() from UserInfo where Dep.GetAncestor(3) = hierarchyid::Parse('/11/1/')

--查看所有的上级节点
select Dep.ToString() from UserInfo where hierarchyid::Parse('/11/1/1/1/1/1/1/1/1/').IsDescendantOf(Dep)=1

--插入新节点(插入与当前层级节点相同的新节点hierarchyid)
insert into UserInfo(UserName,Email,Dep) values(hierarchyid::Parse('/11/1/').GetDescendant('/11/1/1/1/1/1/1/1/1/', NULL),'111@qq.com','测试在/11/1/1/1/1/1/1/1/1/相同层级中插入新用户')

--插入新节点(在父节点下插入第一个子节点hierarchyid)
insert into UserInfo(UserName,Email,Dep) values(hierarchyid::Parse('/11/1/').GetDescendant(NULL, NULL),'111@qq.com','测试在/11/1下插入第一个子节点')

--插入新节点(两个相同节点之间插入hierarchyid)
insert into UserInfo(UserName,Email,Dep) values(hierarchyid::Parse('/11/1/').GetDescendant('/11/1/1/1/1/1/1/1/1/', '/11/1/1/1/1/1/1/1/2/'),'111@qq.com','测试在/11/1/1/1/1/1/1/1/1/与/11/1/1/1/1/1/1/1/2/之间插入新用户')

--修改节点(需要两个参数:原节点数据hierarchyid,新节点数据hierarchyid)。例如要将'/11/1/1/2/' 修改到 '/11/2/'下的'/11/2/1/1'的相同层级
update UserInfo set Dep=Dep.GetReparentedValue(hierarchyid::Parse('/11/1/1/2/'), hierarchyid::Parse('/11/2/1/1'))

以上就是 hierarchyid 类型的简单使用。

注:varchar 类型的 与 hierarchyid 类型的转换

  varchar-->hierarchyid: Dep.ToString()

  hierarchyid-->varchar: hierarchyid::Parse('/11/1') 

 

喜欢本文章的朋友,欢迎关注公众号【程序员在职场】支持一下作者哦。

 

推荐阅读