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

 
 
 
 

Distributed2:Linked Server Login 添加和删除的更多相关文章

  1. SQL SERVER linked server Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

    昨天创建了一个View, 这个view是一系列的表达式(CTE)组成,封装了好多的业务逻辑,简化下语句如下 ;with CTE AS( ...) SELECT a.company_id ,b.comp ...

  2. SQL server 2008 添加,删除字段

    添加,刪除字段 如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [ ...

  3. 从一个Bug说开去--解决问题的思路,Linked Server, Bulk Insert, DataTable 作为参数传递

    声名— 部分内容为杜撰,如有雷同,不胜荣幸! 版权所有,如要引用,请标明出处! 如果打赏,请自便! 1       背景介绍 最近一周在忙一个SQL Server 的Bug,一个简单的Bug,更新两张 ...

  4. Distributed1:Linked Server 添加和删除

    A linked server allows for access to distributed, heterogeneous queries against OLE DB data sources. ...

  5. 在SQL Server中添加Linked Server 图解版

    在开发中,经常需要一个SQL Server服务器去访问另一个服务器,微软提供了一种方式Linked Server 下面是配置流程: 1).打开Server Objects下 Linked Server ...

  6. Sql Server有主外键关系时添加、删除数据

    当表之间有主外键关系时删除数据会被约束,添加.删除失败 解决办法,我们可以先把主外键关系的检查约束给关掉 → 然后删除数据 → 之后再把约束打开 查询出关掉所有外键约束的语句 SELECT 'ALTE ...

  7. 打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

    第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demo ...

  8. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  9. Linked Server: EXECUTE permission denied on object 'xp_prop_oledb_provider', database 'master', owner 'dbo'

    问题出现环境: 使用SQL Server Management Studio 2008 连接到SQL Server 2000的数据库,点击其中一个Oracle链接服务器,单击"目录" ...

随机推荐

  1. DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)

    题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...

  2. 使用sublime text 开发node.js

    http://blog.csdn.net/jwkfreedom/article/details/8450005 本机环境: windows7 64位 1. 下载安装sublime text, 不用注册 ...

  3. eclipse下创建maven项目

    1.创建一个Java项目 1)File--->New--->Other--->Maven--->Maven Projet 2)选择maven-archetype-quickst ...

  4. Android中获取选择图片与获取拍照返回结果差异

    导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...

  5. Python之路Day21-自定义分页和cookie

    本节知识点概要 1.URL 2.views - 请求其他信息 - 装饰器 3.Templates - 母版 - 自定义 4.Models操作 5.分页(自定义分页) 6.cookie 7.sessio ...

  6. 多个table切换 getElementsByClassName

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. java并发编程(十九)障碍器CyclicBarrier

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java 5中加入的新特性,使 ...

  8. SQL SQL语句的增删改查

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  9. VS上关于找不到程序集的问题

    第一次重新装了次vs再次导入以前写的项目发现找不到程序集,出现很多的警告和错误,并且代码里好多都是显示红色的 第二次乱动了下又出现此问题 记录下解决的方案和一些相关的问题方案 1.引用一个DLL,需要 ...

  10. ios 关于问题 no matching provisioning profiles found

    ios 关于问题 no matching provisioning profiles found