Hierarchyid 常用操作

2022-01-15 01:53:25 字數 3163 閱讀 5346

---------內建函式------------

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...