实例表结构

CREATE TABLE [dbo].[Emp](
[ID] [int] IDENTITY(1,1),
[Name] [varchar](50),
[Org] [hierarchyid],
) INSERT INTO Emp(Name,Org) VALUES('吴xx','/')
INSERT INTO Emp(Name,Org) VALUES('谢xx','/1/')
INSERT INTO Emp(Name,Org) VALUES('赵xx','/2/')
INSERT INTO Emp(Name,Org) VALUES('卢xx','/1/1/')
INSERT INTO Emp(Name,Org) VALUES('方xx','/1/2/')
INSERT INTO Emp(Name,Org) VALUES('詹xx','/1/3/')
INSERT INTO Emp(Name,Org) VALUES('沈xx','/2/1/')

实例基础数据

SELECT *,Org.ToString(),Org.GetLevel()
FROM Emp

  

hierarchyid方法引用

ToString:节点路径

--node.ToString()
SELECT *,Org.ToString()
FROM Emp

GetLevel:节点深度

--node.GetLevel()
SELECT *,Org.GetLevel()
FROM Emp SELECT *,Org.GetLevel()
FROM Emp
WHERE Org.GetLevel() = 1

 

GetAncestor:节点N级祖先,即通过祖先节点反向获取指定级别的子节点。

--child.GetAncestor(n)
--指定节点的二级子节点
SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
SELECT * FROM Emp WHERE Org.GetAncestor(2) = @CurrentNode

GetDescendant:节点子节点,大于child1且小于child2,child1/child2可为NULL。

--parent.GetDescendant(child1,child2)
--新增吴子节点,与谢/赵同级,但大于谢且小于赵。
DECLARE @Child1 hierarchyid
DECLARE @Child2 hierarchyid
SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
SELECT @Child1 = Org FROM Emp WHERE Name = '谢xx'
SELECT @Child2 = Org FROM Emp WHERE Name = '赵xx'
INSERT INTO Emp(Name,Org) VALUES('于xx',@CurrentNode.GetDescendant(@Child1,@Child2))

IsDescendantOf:是否是节点的后代节点

--child.IsDescendantOf(parent)
--指定节点下的全部后代节点,包含本身
SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
SELECT * FROM Emp WHERE Org.IsDescendantOf(@CurrentNode) = 1

GetReparentedValue:节点移动,节点路径从oldRoot指向newRoot

--node.GetReparentedValue(oldRoot,newRoot)
--于从指向吴子节点,更新指向赵子节点。
DECLARE @OldRoot hierarchyid
DECLARE @NewRoot hierarchyid
SELECT @CurrentNode = Org FROM Emp WHERE Name = '于xx'
SELECT @OldRoot = Org FROM Emp WHERE Name = '吴xx'
SELECT @NewRoot = Org FROM Emp WHERE Name = '赵xx'
UPDATE Emp SET Org=@CurrentNode.GetReparentedValue(@OldRoot,@NewRoot) WHERE Org = @CurrentNode

GetRoot:根节点

--hierarchyid::GetRoot()
SELECT *
FROM Emp
WHERE Org = hierarchyid::GetRoot()

Parse:从路径字符串转换为hierarchyid值,即编码。

--hierarchyid::Parse()
DECLARE @StringNode varchar(50)
SET @StringNode = '/1/1/'
SELECT *,Org.ToString() FROM Emp WHERE Org = hierarchyid::Parse(@StringNode)

Hierarchyid(层次结构)数据类型的更多相关文章

  1. SQL Server 2012新特性(1)T-SQL操作FileTable目录实例

    在SQL Server 2008提供FileStream,以借助Windows系统本身的API来强化SQL Server对于非结构化数据的支持后,SQL Server 2012更是推出了像Contai ...

  2. 【转】SQL Server sql_variant 类型的比较

    sql_variant 类型用于存储SQL SERVER中支持的各种数据类型. 为了进行 sql_variant 比较,SQL Server 数据类型层次结构顺序划分为多个数据类型系,sql_vari ...

  3. 文件迁移到FileTable中

    看此文档前,先参考一下文档 https://blog.csdn.net/downmoon/article/details/24374609 环境:阿里云ECS SQL Server 2017 + De ...

  4. TSql HierarchyID 数据类型用法

    HierarchyID 数据类型是一种长度可变的系统数据类型.可使用 HierarchyID 表示层次结构中的位置.类型为 HierarchyID 的列不会自动表示树,由应用程序来生成和分配 Hier ...

  5. SQL SERVER 2008 Hierarchyid数据类型

    以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条纪录间的父子关系.但这种方式只能标示其相对位置.解决这类问题在SqlServer2005出现之前通常是采用游标来操作, ...

  6. HierarchyID 数据类型用法

    树形层次结构(Hierarchy)经常出现在有结构的数据中,T-SQL新增数据类型HierarchyID, 其长度可变,用于存储层次结构中的路径.HierarchyID表示的层次结构是树形的,由应用程 ...

  7. SQL Server2008 Hierarchyid数据类型

    以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条 纪录间的父子关系.但这种方式只能标示其相对位置.解决这类问题在SqlServer2005出现之前通常是采用游标来操作 ...

  8. SQL SERVER 数据类型详解(SQL Server 2008)

    数据类型类别 SQL Server 中的数据类型归纳为下列类别: 数字类型 1.精确数字 2.近似数字 3.日期和时间 字符串类型 4.非Unicode字符串 4.Unicode字符串 5.二进制字符 ...

  9. Design3:数据层次结构建模之二

    SQL Server提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌 ...

随机推荐

  1. AngularJS2之Angular正式初探

    前言:angular的官方教程真的不错.强烈推荐!!!] 按照环境搭建教程新建一个项目: 项目的结构如下: 其中package.json指示node需要安装的插件(npm install指令会安装的插 ...

  2. 开子线程下载图片,回到主线程刷新UI步骤

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [NSThread detachN ...

  3. SpringMVC实现注解式权限验证(转)

    SpringMVC学习系列(9) 之 实现注解式权限验证   对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用serv ...

  4. PHP判断一个变量是否可以通过foreach进行遍历

    <?php if( !is_array( $items ) && !$items instanceof Traversable ) //Throw exception here ...

  5. C# asp.net PhoneGap html5

    很久没写博客,今天自己写一篇吧.来谈一谈c# PhoneGap,html5 与asp.net.能搜到这篇博客就说明你是一位.net开发者,即将或者正在从事移动开发. 大家可能都有疑,我是一名.net开 ...

  6. Servle资源注射

    Servle资源注射@WebServlet(name = "DownloadServlet",urlPatterns ="/DownloadServlet" ) ...

  7. swift3.0 原生GET请求 POST同理

    swift3.0 原生GET请求  POST同理 func getrequest(){ let url = URL(string: "http://117.135.196.139:" ...

  8. sql第三天

    ->完整的select语句及执行顺序(必须记住) 5...select 5.2->distinct 7...top n [percent] 5.1->列名 聚合函数(1.2-> ...

  9. sqlite导入后无法使用

    问题:sqlite导入后无法使用 解决方式:引入sqlite3 的libraries ,然后再在 projectName-Bridging-Header.h 中添加 #import "sql ...

  10. Python 智能处理方向的工具

    机器视觉类:OpenCV. 自然语言处理:NLTK, jieba(Python中文分词组件),HanLP, FudanNLP, NLPIR, http://tm.itc.ntnu.edu.tw/CNL ...