Hierarchyid(层次结构)数据类型

实例表结构

CREATE TABLE [dbo].[Emp](
	[ID] [int] IDENTITY(1,1),
	[Name] [varchar](50),
	[Org] [hierarchyid],
)

INSERT INTO tempdb..Emp(Name,Org) VALUES(‘吴xx‘,‘/‘)
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘谢xx‘,‘/1/‘)
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘赵xx‘,‘/2/‘)
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘卢xx‘,‘/1/1/‘)
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘方xx‘,‘/1/2/‘)
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘詹xx‘,‘/1/3/‘)
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘沈xx‘,‘/2/1/‘)

实例基础数据

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

  

hierarchyid方法引用

ToString:节点路径

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

  

GetLevel:节点深度

--node.GetLevel()
SELECT *,Org.GetLevel()
FROM tempdb..Emp

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

  

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

--child.GetAncestor(n)
--指定节点下的二级子节点
SELECT @CurrentNode = Org FROM tempdb..Emp WHERE Name = ‘吴xx‘
SELECT * FROM tempdb..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 tempdb..Emp WHERE Name = ‘吴xx‘
SELECT @Child1 = Org FROM tempdb..Emp WHERE Name = ‘谢xx‘
SELECT @Child2 = Org FROM tempdb..Emp WHERE Name = ‘赵xx‘
INSERT INTO tempdb..Emp(Name,Org) VALUES(‘于xx‘,@CurrentNode.GetDescendant(@Child1,@Child2))

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

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

GetReparentedValue:当前节点变更新路径,从oldRoot指向newRoot

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

  

GetRoot:根节点

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

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

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

时间: 2024-10-11 05:32:23

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

【转】SQL Server sql_variant 类型的比较

sql_variant 类型用于存储SQL SERVER中支持的各种数据类型. 为了进行 sql_variant 比较,SQL Server 数据类型层次结构顺序划分为多个数据类型系,sql_variant 数据类型在用于转换的数据类型层次结构列表中位于顶部. 数据类型层次结构 数据类型系列 sql_variant sql_variant datetime2 日期和时间 datetimeoffset 日期和时间 datetime 日期和时间 smalldatetime 日期和时间 date 日期

锋利的SQL2014:层次结构操作之Hierarchyid

在8.6.4节介绍了使用递归CTE查询层次结构数据的方法,本节将介绍一种使用hierarchyid数据类型解决此问题的方法.Hierarchyid数据类型是从SQL Server2008开始提供的,专门用于解决层次结构问题. hierarchyid使用"/"符号来表示层次结构,如顶层(根节点)为"/",其后的子节点可以是"/1/"."/2/"等.再之后的节点可以是"/1/1/"."/2/1/&qu

TSql HierarchyID 数据类型用法(sqlserver2008以上有此数据类型)

TSql HierarchyID 数据类型用法 2017年04月25日 09:47:46 阅读数:110 HierarchyID 数据类型是一种长度可变的系统数据类型.可使用 HierarchyID 表示层次结构中的位置.类型为 HierarchyID 的列不会自动表示树,由应用程序来生成和分配 HierarchyID 值,使行与行之间的所需关系反映在这些值中. 1,字符串表示 必须以"/"开头,以"/"结尾,"/"之间使用数值标识某一个元素,一

TSql HierarchyID 数据类型用法

HierarchyID 数据类型是一种长度可变的系统数据类型.可使用 HierarchyID 表示层次结构中的位置.类型为 HierarchyID 的列不会自动表示树,由应用程序来生成和分配 HierarchyID 值,使行与行之间的所需关系反映在这些值中. 1,字符串表示 必须以“/”开头,以“/”结尾,“/”之间使用正整数标识某一个元素,例如“/”,“/1/2/”,“/1/2/3/” 2,数据类型的转换 declare @sa Nvarchar(100) declare @ha Hierar

SQL Server 2008数据类型

在创建表时,必须为表中的每列指派一种数据类型.本节将介绍SQL Server中最常用的一些数据类型.即使创建自定义数据类型,它也必须基于一种标准的SQL Server数据类型.例如,可以使用如下语法创建一种自定义数据类型(Address),但要注意,它基于SQL Server标准的varchar数据类型. CREATE TYPE Address FROM varchar(35) NOT NULL 如果在SQL Server Management Studio的表设计界面中更改一个大型表中某列的数

SQL的数据类型

1. 字符数据类型 字符数据类型包括varchar.char.nvarchar.nchar.text以及ntext.这些数据类型用于存储字符数据.varchar和char类型的主要区别是数据填充.如果有一表列名为FirstName且数据类型为varchar(20),同时将值Brian存储到该列中,则物理上只存储5个字节.但如果在数据类型为char(20)的列中存储相同的值,将使用全部20个字节.SQL将插入拖尾空格来填满20个字符. 如果要节省空间,那么为什么还使用char数据类型呢?使用var

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

数据类型类别 SQL Server 中的数据类型归纳为下列类别: 数字类型 1.精确数字 2.近似数字 3.日期和时间 字符串类型 4.非Unicode字符串 4.Unicode字符串 5.二进制字符串 6.其他数据类型 7.CLR 在 SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组: 大值数据类型:varchar(max).nvarchar(max) 和 varbinary(max) 大型对象数据类型:text.ntext.image.varchar(max).nv

SQL Server 使用 Hierarchyid 操作层次结构数据

层次结构数据定义为一组通过层次结构关系互相关联的数据项. 在层次结构关系中,一个数据项是另一个项的父级或子级. sql server2008开始内置的 hierarchyid 数据类型使存储和查询层次结构数据变得更为容易.hierarchyid 其实是 CLR 数据类型. 废话不多说,看不明白就实际操作一把,然后再回过头来理解. 下面先创建一个表,并插入一些数据: create table RoleMan ( NodeId hierarchyid not null, RoleId int not

ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 在ElasticSearch中,使用JSON结构来存储数据,