---------内置函数------------

select hierarchyid::GetRoot()--0x

select hierarchyid::Parse('/1/1/') --0x5AC0

select cast(0x5AC0 as hierarchyid)--0x5AC0

select cast('/1/' as hierarchyid)--0x5AC0

select cast(0x5AC0 as hierarchyid).ToString()--/1/1/

select cast(0x5AC0 as hierarchyid).GetLevel()--2

 

-----------IsDescendantOf------------ 判断@Node是否为@parent的子节点

declare @Node hierarchyid

declare @parent hierarchyid

set @Node='/1/2/3/4/'

set @parent='/1/2/'

 

select @Node.IsDescendantOf(@parent)--1

select @parent.IsDescendantOf(@Node)--0

 

--------GetAncestor ( n ) ----------返回指定层次的祖先.

declare @hy hierarchyid

declare @c int

set @hy='/1/1/2/1/'

set @c=@hy.GetLevel()

select @hy.GetAncestor(0).ToString()--/1/1/2/1/

select @hy.GetAncestor(1).ToString()--/1/1/2/

select @hy.GetAncestor(@c).ToString()--/

select @hy.GetAncestor(@c+1).ToString()--null

 

 

 

-----------GetDescendant-----------返回子集

//1.如果父级为NULL,则返回NULL。

 

---如果父级不为NULL----

--2.而child1 和child2 为NULL,则返回父级的子级。--

declare @hy hierarchyid

set @hy='/1/1/'

select @hy.GetDescendant(NULL,NULL).ToString()--/1/1/1/

 

--3. 返回值 在child1于child2之间 , child1>child2 且必须为@hy的子集--

select @hy.GetDescendant('/1/1/5/',null).ToString()--/1/1/6/

select @hy.GetDescendant(null,'/1/1/5/').ToString()--/1/1/4/

select @hy.GetDescendant('/1/1/2/','/1/1/5/').ToString()--/1/1/3/

select @hy.GetDescendant('/1/1/3/','/1/1/4/').ToString()--/1/1/3.1/

select @hy.GetDescendant(null,'/1/1/1/5/').ToString()--报异常

select @hy.GetDescendant('/1/1/5/','/1/1/3/').ToString()--报异常

 

---------◆GetReparentedValue :可以用来移动节点 --------------

注意:@parent是Node的祖先

 

declare @Node hierarchyid

DECLARE @NodeChild1 hierarchyid

declare @parent hierarchyid, @new hierarchyid

set @Node='/1/2/3/4/'

set @NodeChild1='/1/2/3/4/5/'

set @parent='/1/2/'

set @new='/5/6/7/'

 

SET @Node=@Node.GetReparentedValue(@parent, @new)

select @Node.ToString()--/5/6/7/3/4/

SELECT @NodeChild1.GetReparentedValue(hierarchyid::Parse('/1/2/3/4/'), @Node).ToString()

 

 

移动子树

另一项常用操作是移动子树。下面的过程采用 @oldMgr 的子树作为参数,使其(包括 @oldMgr)成为 @newMgr 的子树。

CREATE PROCEDURE MoveOrg(@oldMgr nvarchar(256), @newMgr nvarchar(256) )

AS

BEGIN

DECLARE @nold hierarchyid, @nnew hierarchyid

SELECT @nold = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @oldMgr ;

 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRANSACTION

SELECT @nnew = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @newMgr ;

 

SELECT @nnew = @nnew.GetDescendant(max(OrgNode), NULL)

FROM HumanResources.EmployeeDemo WHERE OrgNode.GetAncestor(1)=@nnew ;

 

UPDATE HumanResources.EmployeeDemo

SET OrgNode = OrgNode.GetReparentedValue(@nold, @nnew)

WHERE OrgNode.IsDescendantOf(@nold) = 1 ;

 

COMMIT TRANSACTION

END ;

GO

 

 

 

参考:

 

http://technet.microsoft.com/zh-cn/library/bb677212(v=sql.105).aspx

http://blog.csdn.net/tjvictor/article/details/4395681

http://msdn.microsoft.com/zh-cn/library/bb677290(v=sql.105).aspx

 

 

 

    

Hierarchyid 常用操作的更多相关文章

  1. 【三】用Markdown写blog的常用操作

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  2. php模拟数据库常用操作效果

    test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...

  3. Mac OS X常用操作入门指南

    前两天入手一个Macbook air,在装软件过程中摸索了一些基本操作,现就常用操作进行总结, 1关于触控板: 按下(不区分左右)            =鼠标左键 control+按下        ...

  4. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  5. nodejs配置及cmd常用操作

    一.cmd常用操作 1.返回根目录cd\ 2.返回上层目录cd .. 3.查找当前目录下的所有文件dir 4.查找下层目录cd window 二.nodejs配置 Node.js安装包及源码下载地址为 ...

  6. Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理

    摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■  详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...

  7. python 异常处理、文件常用操作

    异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm

  8. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  9. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

随机推荐

  1. 兼容各浏览器的iframe - onlaod事件

    上次工作中,在使用 Iframe+FormSubmit进行无刷新提交时,如果后台返回的数据有延迟,或者浏览器对Iframe内容的更改过慢的话,会遇到onload响应在Iframe内容改变之前触发,这也 ...

  2. WinForm 容器控件

    容器控件: 布局:2个属性:Anchor:锁定位置Dock:填充位置一般Dock是与容器控件配合使用 Panel:就是一个区域,类似于DIV,可以独立布局,还可以让其它控件及容器在它的内部再次布局 F ...

  3. jquery.autocomplete自动补齐和自定义格式

    1.简单的下拉自动补齐,可以使用本地或远程数据源 <input name="autoTag" id="autoTag" /> var source ...

  4. Java的堆(Heap)和栈(Stack)的区别

    Java中的堆(Heap)是一个运行时数据区,用来存放类的对象:栈(Stack)主要存放基本的数据类型(int.char.double等8种基本数据类型)和对象句柄. 例1 int a=5; int ...

  5. PyCharm不能自动import解决方法_PyCharm cannot auto import package troubleshooting

    本人起初是用Eclipse+Pydev学习python的,其实也觉得挺好用.不过后来因为同事推荐去试了下PyCharm,就一发不可收拾的爱上了. 严格来说,题目上的问题其实对于很多人都不算是问题,但是 ...

  6. jquery $(document).ready() 与window.onload

  7. 【局部特征】ASIFT

    由于相机正面白摄物体时,相机的光轴方向可能发生变化,带来扭曲.而SIFT算法虽具有完全的尺度不变性,但不具有完全的仿射不变性,对拍摄角度发生大角度空间变化的图像特征提取有一定的局限性.ASift通过模 ...

  8. Hibernate(八)__级联操作、struts+hibernate+接口编程架构

    级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...

  9. 实战手记:让百万级数据瞬间导入SQL Server

    想必每个DBA都喜欢挑战数据导入时间,用时越短工作效率越高,也充分的能够证明自己的实力.实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本文将向大家推荐一个挑战4秒极限让百万级数据瞬间 ...

  10. Webform(Linq高级查、分页、组合查询)

    一.linq高级查 1.模糊查(包含) 1 public List<User> Select(string name) 2 { 3 return con.User.Where(r => ...