SQL Server提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用。当需要表示各值之间的嵌套关系,并且该关系可以采用顺序路径语法表达时,HierarchyID 非常有用。

顺序路径看起来有点像文件路径,但它不使用目录和文件名,而是使用数值。与其他父/子关系类似,所有顺序路径都必须归结于根节点。在 SQL Server 2008 中,根节点的文本表示是一个 (/) 字符。具有顺序路径的元素通常由整数表示,但也可能使用小数。顺序路径必须使用另一个 (/) 字符结束。但顺序路径并不以文本形式存储在数据库中。而是将其采用数学方法散列成二进制值,然后将这些二进制值存储在数据页中。
示例代码如下,Parentid作为计算列,从ID中获取 Parent ID。
create table dbo.emph2
(
idpath hierarchyid not null primary key,
id int not null,
parentid as idpath.GetAncestor(1) persisted foreign key references dbo.emph2(idpath),
descr varchar(100)
)

HierarchyID 数据类型的方法如下,CLR类型区分大小写。

方法 返回结果 参数值 用途
GetAncestor 代表父级或更高级元素顺序路径的 HierarchyID。 整数值,指明沿当前顺序路径向上遍历的级数。 找出顺序路径中此实例的父级、祖父级或更高级别的元素。
GetDescendent HierarchyID,代表当前节点的子节点、孙子节点或更低级别子孙节点的路径。 两个 HierarchyID 实例,其中一个可以为 null 或者两者都为 null,用于限制可能返回的子项。 获取路径,以便在当前顺序路径中某个深度处插入新元素。
GetLevel 16 位整数值,代表顺序路径的总深度。 无。 确定两条顺序路径是否具有相同的深度。
GetRoot 具有零个元素的顺序路径的 HierarchyID。 无。 找出任意顺序路径的绝对根。
IsDescendantOf 如果作为参数传入的顺序路径是调用实例的子项,则返回 1。 HierarchyID 实例。 确定给定的 HierarchyID 是否是另一个实例的子项。
Parse HierarchyID 实例。 顺序路径的文本表示。 从给定的路径创建 HierarchyID 实例。当 HierarchyID 实例设置为字符串时将隐式调用此方法。
GetReparentedValue 在将当前项目从一条路径移动到另一条路径时,代表完整顺序路径的 HierarchyID。 当前顺序路径表示为 HierarchyID,且目标顺序路径也表示为 HierarchyID。 将一行或多行值从一条父顺序路径移动到另一条父顺序路径。
ToString HierarchyID 顺序路径的文本表示。 无。 分析 HierarchyID 的顺序路径。

GetRoot是个静态方法,在Server sql 可以通过类型直接调用,Root 其实是一个字符 '\',HierarchyID 类型的数据无法直接print,必须调用ToString()方法,才能显示出来。

print HierarchyID::GetRoot().ToString()

示例代码如下

1,插入root元素,root元素是一个‘/’,HierarchyID类型必须有一个Root元素。

--插入root 元素
insert into dbo.emph2(idpath,id,descr)
values(HierarchyID::GetRoot(),0,'root')

2,类型为 HierarchyID 的列不会自动表示树,由应用程序来生成和分配 HierarchyID 值,使行与行之间的所需关系反映在这些值中。

emph表的数据来源于《数据层次结构建模之一》

;with cte(path,id,parentid,descr) as
(
select cast('/'+cast(id as varchar) as varchar(100)) as path, id,parentid,descr
from dbo.emph
where id=1 union all select cast(c.path+'/'+ cast(e.ID as varchar) as varchar(max)) as path,
e.ID,e.ParentID,e.Descr
from dbo.emph e
inner join cte c on e.ParentID=c.id
)
insert into dbo.emph2(idpath,id,descr)
select path+'/',id,descr
from cte

3,查看结果

select idpath.ToString(),id,parentid.ToString(),descr
from dbo.emph2

4,查看M1手下的所有员工

select e.idpath.ToString() as IDPath,e.id,e.parentid.ToString() as ParentIDPath,e.descr
from dbo.emph2 e
inner join dbo.emph2 e2 on e.idpath.IsDescendantOf(e2.idpath)=1
where e2.id=2

5,查看id所在的Level,只需要调用HierarchyID类型的GetLevel()。

select e.idpath.ToString() as IDPath,e.id,e.parentid.ToString() as ParentIDPath,e.descr,e.idpath.GetLevel() as Level
from dbo.emph2 e
inner join dbo.emph2 e2 on e.idpath.IsDescendantOf(e2.idpath)=1
where e2.id=2

 
 
 
 

Design3:数据层次结构建模之二的更多相关文章

  1. Design2:数据层次结构建模之二

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

  2. Design1:数据层次结构建模之一

    1,在现实世界中,有很多现象存在层次结构,公司的人事职称是典型的层次结果,如下图 Sql Server是关系型DB,适合存储二维关系的数据,如何存储具有层次结构的数据了?需要使用一个字段ParentI ...

  3. ApacheCN 大数据译文集(二) 20211206 更新

    Hadoop3 大数据分析 零.前言 一.Hadoop 简介 二.大数据分析概述 三.MapReduce 大数据处理 四.基于 Python 和 Hadoop 的科学计算和大数据分析 五.基于 R 和 ...

  4. 将Excel中数据导入数据库(二)

    在上篇文章中介绍到将Excel中数据导入到数据库中,但上篇文章例子只出现了nvachar类型,且数据量很小.今天碰到将Excel中数据导入数据库中的Excel有6419行,其中每行均有48个字段,有i ...

  5. Ajax实现xml文件数据插入数据库(二)--- ajax实现与jsp的数据交互。

    在上一篇文章中我们成功得到了重新组织后的数据,接下来需要做的便是将数据插入到数据库中了.在与数据库打交道的过程中有一些方法是普遍的,我们将这些通用方法封装到一个DbUtil类中,以便复用,封装好的Db ...

  6. Mego开发文档 - 数据注释建模

    数据注释建模 Mego框架使用一组约定来基于CLR类来构建模型.您可以指定其他配置来补充或覆盖通过约定发现的内容. 在 Mego 中所有的数据对象必须要有主键.这里需要声明与EF不同的是框架只支持数据 ...

  7. Mongodb同步数据到hive(二)

    Mongodb同步数据到hive(二) 1.            概述 上一篇文章主要介绍了mongodb-based,通过直连mongodb的方式进行数据映射来进行数据查询,但是那种方式会对线上的 ...

  8. CAD把当前图上数据保存为一个二进流对象(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::WriteBinStreamEx 把当前图上数据保存为一个二进流对象,详细说明如下: 参数 说明 LPCTSTR pszPasswor ...

  9. QuickBI助你成为分析师-数据建模(二)

    摘要: 数据集编辑功能界面介绍以及常见问题总结. 在数据集编辑界面可以进行数据建模来更好的展示数据,创建数据集默认将数值类型字段作为度量,日期.字符串等类型作为维度,度量可以根据维度分组展示.下面来介 ...

随机推荐

  1. ORA-28547:(Navicat Premium连接oracle报错)

    1.背景 Navicat Premium连接oracle报 ORA-28547:connection to server failed, probable Oracle Net admin errro ...

  2. 铁乐学python_Day42_线程-信号量事件条件

    铁乐学python_Day42_线程-信号量事件条件 线程中的信号量 同进程的一样,Semaphore管理一个内置的计数器, 每当调用acquire()时内置计数器-1:调用release() 时内置 ...

  3. 关于 svn

    文章:http://www.cnblogs.com/xing901022/p/4403339.html 视频http://www.imooc.com/learn/109        7******* ...

  4. Sailing

    Sailing 目录 1基本信息 2歌曲简介 3歌词内容 4歌手简介 5专辑介绍 1基本信息编辑 歌曲: Sailing 所属专辑: Atlantic Crossing 艺人:Rod Stewart[ ...

  5. 事后诸葛亮之Alpha十天冲刺之失败总结

    参考自构建之法p341页的模板 首先自己预计了一下,项目gg的可能有百分之50这里面有百分之80是我的责任.冲刺失败我承担主要责任. 1.设想和目标: 1.计划实现类似华为云的小功能之团队合作开发功能 ...

  6. swift的类型系统及类型(内存)信息获取:接口、编译运行时、反射、内存布局

    swift是静态语言,没有在运行时保存类型的结构信息(isa.class). 一.self.Self.Type.typeof extension Collection where Self.Eleme ...

  7. CVE-2014-4210SSRF漏洞分析

    直接定位SearchPublicRegistries.jsp文件,47行接受输入的变量. 结果输出位置在120行 SearchPublicRegistries.jsp引入com.bea.uddiexp ...

  8. 两个Integer比较大小需要注意的误区

    通过下面的例子,来了解integer比较大小需注意的几点. eg.定义Integer对象a和b,比较两者结果为:a不等于b Integer a = 1; Integer b = 1; if(a==b) ...

  9. 【C++0x】表达式之类型(decltype)

      C++0x引入了新的关键字decltype,它是一个操作符,用来取得表达式的类型,主要在泛型编程中使用.这里,简单介绍一下语法规则. 语法形式:decltype (expression)其中,这里 ...

  10. 在Qtlabel中显示数字十六进制和十进制都可以

    ui->label_6->setText(QString::number(table_test[0]<<8 | table_test[1]));这样子就可以把十六进制的数转换为 ...