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

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. 【原创】Kakfa message包源代码分析

    笔者最近在研究Kafka的message包代码,有了一些心得,特此记录一下.其实研究的目的从来都不是只是看源代码,更多地是想借这个机会思考几个问题:为什么是这么实现的?你自己实现方式是什么?比起人家的 ...

  2. 日志插件 log4net 的使用

    文本格式说明 可以记载的日志类别包括:FATAL(致命错误).ERROR(一般错误).WARN(警告).INFO(一般信息).DEBUG(调试信息). 文本参数说明 %m(message):输出的日志 ...

  3. ASP.NET MVC系列:为已有模型添加新的属性

    在模型类Movie中添加一个新的属性Rating

  4. 基于WinCE的JSON 类库 源码

    基于WinCE的JSON 类库,可以将对象序列化成字符串和文件. 提示,其在反序列化时有一个BUG: 如果对象的某个字段值为 null,将其序列化成字符串,然后将该字符串反序列化成对象时会报异常. 这 ...

  5. MVC 框架搭建

    1.0 初步建立目录和项目 2.0 设置层之间的引用 IRepository引用 ModelRepository引用 Model,IRepositoryIServices引用 Model,IRepos ...

  6. 显示XML文档时排序数据

    先看XML文档: 也可拷贝下面代码另存为XMl文档: <stepList> <steps> <step> <order>1</order> ...

  7. 关于ajax的同步和异步

    今天在开发中遇到个ajax访问Action 返回json 拼接Html,有时候能显示,有时候显示不出来. 考虑后一定是页面元素加载的问题. 所以把jq ajax设置为同步. 同步意为当访问后台代码时, ...

  8. Swift 值类型和引用类型

    Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享 ...

  9. 一个故事讲清楚NIO

    转载请引用:一个故事讲清楚NIO 假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) ...

  10. 清除Windows的DNS缓存

    最近ESET杀毒软件老是提示受到DNS缓存攻击,然后就不能打开网页,或者打开得很慢.这是由于缓存的DNS被更改,访问的是错误的IP地址造成的. 解决的办法就是清除DNS缓存,打开DOS命令窗口,先后输 ...