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. 封装CIImage实现实时渲染

    封装CIImage实现实时渲染 CIImage属于CoreImage里面的东东,用来渲染图片的,为什么要封装它呢?其实很简单,封装好之后使用更加方便. 如果直接使用CIImage渲染图片,使用的流程如 ...

  2. Linux 软硬链接详解

    软链接 软链接: 类似于windows的快捷方式,—>文本文件,但是包含了真实文件的地址               源文件删除,则软连接也删除               软链接可以放在任何文 ...

  3. 《C++ Primer Plus》读书笔记之十—类和动态内存分配

    第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的 ...

  4. Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)

    hbase shell中执行java方法(高手必备),务必掌握! 1. 2. 3. 4. 更多命令,见scan help.在实际工作中,多用这个!!! API参考: http://hbase.apac ...

  5. 遇见C++ Lambda

    转自:https://www.cnblogs.com/allenlooplee/archive/2012/07/03/2574119.html 遇见C++ Lambda Written by Alle ...

  6. 利用Gson将JSON数据进行格式化(pretty print)

    我们可以利用Gson包将String类型的JSON数据进行格式化. Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonPa ...

  7. tyvj1953 Normal

    题目链接 正解:点分治+$FFT$. 很想吐槽一下$bzoj$,为什么搬了别的$oj$的题还设成权限题.. 首先我们考虑期望的线性性,即考虑每个点的贡献. 显然每个点的贡献就是它在点分树上的深度,所以 ...

  8. MySQL半同步主从.md

    MySQL Semisynchronous Replication 复制架构衍生史 1.普通的replication,异步同步. 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非 ...

  9. 1、JVM-走进java

    1.1.概述 Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统.移动终端.企业服务器.大 ...

  10. 20145203 实验五 Java网络编程及安全

    20145203 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 1.基于Java Socket实现安全传输 2 ...