实例表结构

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. HttpContext.Current.Request.ServerVariables

    Request.ServerVariables("Url") 返回服务器地址Value 0: /WebSite1/Default.aspx Request.ServerVariab ...

  2. 蓝桥杯 C语言 入门训练 Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  3. input中的name,value以及label中的for

    input具有很多属性,比较常用的有type,value,name,placeholder,multiple,checked等.对于其中的name.value.label相关以及标签外的文字,我一直是 ...

  4. ORA-12516 TNS监听程序找不到符合协议堆栈要求的可用处理程序

    服务器上某个数据库出现' ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程'错误,要解决该问题首先查看一下数据库现有的进程数,是否已经达到参数processes的大小. 使用 ...

  5. Python 调用shell

    第一种,os.system("The command you want"). 这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回.返回值是依赖于系统的,直接返回系统的调用返回 ...

  6. js-时间函数相互转化

    1.日期函数 获取当前时间对象 var date = new Date(); 2.日期函数 => 时间对象 (yyyy-mm-dd hh:mi:ss => 时间对象) endLogTime ...

  7. js实现复制内容

    一.实现点击按钮,复制文本框中的的内容                         <script type="text/javascript"> function ...

  8. nginx在window上无法启动的问题

    内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP ...

  9. 默认conf指向位置

    查看nginx 默认配置文件所在位置 >> nginx -t  print --> nginx: the configuration file /etc/nginx/nginx.co ...

  10. 用 monitorix 开启linux图形化监控

    # yum install monitorix # service monitorix starthttp://host:8080/monitorix/