sql2008 层次结构id函数 hierarchyid 经典总结
### SQL Server 2008 HierarchyId 函数经典总结 在SQL Server 2008中,`HierarchyId`是一种特殊的数据类型,用于高效地存储和查询层次结构数据。这种数据类型支持一系列内置方法来处理层次关系,使得在数据库中处理树状结构或层级结构变得更加简单和高效。下面将详细介绍`HierarchyId`中的几个关键方法及其应用场景。 #### 1. GetRoot() 此方法返回层次结构的根节点。通常表示为`0x`,这是因为`HierarchyId`内部使用了二进制格式来表示层次路径。 **示例代码:** ```sql SELECT HierarchyId::GetRoot(); -- 输出: 0x ``` #### 2. Parse() 此方法将字符串形式的路径转换成`HierarchyId`对象。路径通常采用类似`/1/2/3/`这样的形式,每个数字代表一个节点在父节点下的索引。 **示例代码:** ```sql SELECT HierarchyId::Parse('/1/1/'); -- 输出: 0x5AC0 ``` #### 3. Cast() 将`HierarchyId`对象转换为其他数据类型(如字符串)或者反之亦然。这在需要将层次结构路径以字符串形式显示时非常有用。 **示例代码:** ```sql SELECT CAST('/1/' AS HierarchyId); -- 输出: 0x5AC0 SELECT CAST(0x5AC0 AS HierarchyId); -- 输出: 0x5AC0 ``` #### 4. ToString() 将`HierarchyId`对象转换为字符串形式,便于人类阅读。这在需要将层次结构路径以字符串形式显示时非常有用。 **示例代码:** ```sql SELECT CAST(0x5AC0 AS HierarchyId).ToString(); -- 输出: /1/1/ ``` #### 5. GetLevel() 获取当前节点在层次结构中的层级深度。例如,根节点的层级深度为0,其直接子节点的层级深度为1,依此类推。 **示例代码:** ```sql SELECT CAST(0x5AC0 AS HierarchyId).GetLevel(); -- 输出: 2 ``` #### 6. IsDescendantOf() 判断当前节点是否是另一个节点的后代。如果当前节点位于指定父节点之下,则返回1;否则返回0。 **示例代码:** ```sql DECLARE @Node HierarchyId; DECLARE @Parent HierarchyId; SET @Node = '/1/2/3/4/'; SET @Parent = '/1/2/'; SELECT @Node.IsDescendantOf(@Parent); -- 输出: 1 SELECT @Parent.IsDescendantOf(@Node); -- 输出: 0 ``` #### 7. GetAncestor(n) 获取当前节点向上第n级的祖先节点。如果n大于当前节点所在的层级深度,则返回null。 **示例代码:** ```sql DECLARE @Hy HierarchyId; DECLARE @C INT; SET @Hy = '/1/1/2/1/'; SET @C = @Hy.GetLevel(); SELECT @Hy.GetAncestor(0).ToString(); -- 输出: /1/1/2/1/ SELECT @Hy.GetAncestor(1).ToString(); -- 输出: /1/1/2/ SELECT @Hy.GetAncestor(@C).ToString(); -- 输出: / SELECT @Hy.GetAncestor(@C + 1).ToString(); -- 输出: null ``` #### 8. GetDescendant() 获取两个节点之间的一个后代节点。如果提供的child1或child2参数为空,则返回null。 **示例代码:** ```sql DECLARE @Hy HierarchyId; SET @Hy = '/1/1/'; SELECT @Hy.GetDescendant(NULL, NULL).ToString(); -- 输出: /1/1/1/ SELECT @Hy.GetDescendant('/1/1/5/', NULL).ToString(); -- 输出: /1/1/6/ SELECT @Hy.GetDescendant(NULL, '/1/1/5/').ToString(); -- 输出: /1/1/4/ SELECT @Hy.GetDescendant('/1/1/2/', '/1/1/5/').ToString(); -- 输出: /1/1/3/ SELECT @Hy.GetDescendant('/1/1/3/', '/1/1/4/').ToString(); -- 输出: /1/1/3.1/ SELECT @Hy.GetDescendant(NULL, '/1/1/1/5/').ToString(); -- 异常 SELECT @Hy.GetDescendant('/1/1/5/', '/1/1/3/').ToString(); -- 异常 ``` #### 9. GetReparentedValue() 此方法用于改变一个节点的父节点。可以用于模拟移动节点到新位置的情况,例如,在组织结构图中将员工从一个部门移动到另一个部门。 **示例代码:** ```sql DECLARE @Node HierarchyId; DECLARE @Parent HierarchyId, @New HierarchyId; SET @Node = '/1/2/3/4/'; SET @Parent = '/1/2/'; SET @New = '/5/6/7/'; SET @Node = @Node.GetReparentedValue(@Parent, @New); SELECT @Node.ToString(); -- 输出: /5/6/7/3/4/ ``` 通过以上介绍,我们可以看出`HierarchyId`提供了一种非常有效的方式来处理层次结构数据。它不仅能够简化数据的存储,还大大提高了查询效率。对于那些需要频繁处理树状或层级结构数据的应用场景来说,`HierarchyId`无疑是一个非常强大的工具。
select hierarchyid::GetRoot()--0x
select hierarchyid::Parse('/1/1/') --0x5AC0
select cast(0x5AC0 as hierarchyid)--0x5AC0
select cast('/1/' as hierarchyid)--0x5AC0
select cast(0x5AC0 as hierarchyid).ToString()--/1/1/
select cast(0x5AC0 as hierarchyid).GetLevel()--2
-----------IsDescendantOf------------ 判断@Node是否为@parent的子节点
declare @Node hierarchyid
declare @parent hierarchyid
set @Node='/1/2/3/4/'
set @parent='/1/2/'
select @Node.IsDescendantOf(@parent)--1
select @parent.IsDescendantOf(@Node)--0
--------GetAncestor ( n ) ----------返回指定层次的祖先.
declare @hy hierarchyid
declare @c int
set @hy='/1/1/2/1/'
set @c=@hy.GetLevel()
select @hy.GetAncestor(0).ToString()--/1/1/2/1/
select @hy.GetAncestor(1).ToString()--/1/1/2/
select @hy.GetAncestor(@c).ToString()--/
select @hy.GetAncestor(@c+1).ToString()--null
-----------GetDescendant-----------返回子集
- qoushui2014-10-05简明扼要。不过移动子树的没有
- 粉丝: 114
- 资源: 740
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 【锂电池剩余寿命预测】TCN时间卷积神经网络锂电池剩余寿命预测,马里兰大学锂电池数据集(Pytorch完整源码和数据)
- stm32 USB 复合设备使用msc cdc
- 武汉、西安等城市预处理后的路网数据,包括道路双线转单线、中心打断等等
- 【锂电池剩余寿命预测】Transformer锂电池剩余寿命预测,马里兰大学锂电池数据集(Pytorch完整源码和数据)
- 汽车电机壳体压装产线sw18可编辑全套技术资料100%好用.zip
- boot-win7.c2c84adb.mp4
- redis笔记自学笔记自学笔记
- 前端分析-2023071100789
- 工创赛k210视觉识别
- 前端分析-2023071100789
- Java 21 新特性详解:虚拟线程、字符串模板与模式匹配等亮点
- Photoshop-CS6-13.0.1-简化版
- 通过网盘分享的文件:中国国家级地面气象站基本气象要素日值数据集(V3.0)SURF-CLI-CHN-MUL-DAY-V3.0.zip
- AI游戏Flappy-Bird
- Java各版本新特性一览表,汇总Java 8~21的新特性,按功能分类速查
- 大模型与智能制造融合创新报告,涵盖智能制造背景、大模型技术赋能、工艺优化、智能研发、生产调度、供应链优化、数据安全等内容,助力制造业降本增效、智能化升级与高效决策,适用于行业报告撰写与企业战略规划