---------內建函式------------
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 @[email protected]()
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 @[email protected](@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) )
asbegin
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參考:
Hierarchyid 常用操作
內建函式 select hierarchyid getroot 0x select hierarchyid parse 1 1 0x5ac0 select cast 0x5ac0 as hierarchyid 0x5ac0 select cast 1 as hierarchyid 0x5ac0 se...
使用hierarchyid查詢分層資料
目錄 誰為jolynn工作?使用hierarchyid函式回答 hierarchyid型別內建函式 在本文中,我們將介紹如何執行乙個查詢以獲取層次結構的一部分。對於這個問題,我們將使用 adventureworks 資料庫。employee 表中隱藏的是 adventureworks 的組織結構。雖...
hierarchyid有關的一些函式
於hierarchyid有關的一些函式主要有 getancestor 取得某乙個級別的祖先 getdescendant 取得某乙個級別的子代 getlevel 取得級別 getroot 取得根 isdescendantof 判斷某個節點是否為某個節點的子代 parse 將字串轉換為hierarchy...