T-SQL HIERACHYID.GETREPARENTEDVALUE

 SELECT
  NodeId,
  NodeId.ToString() AS NodeIdPath,
  dbo.fnGetFullDisplayPath(NodeId) AS NodeIdDisplayPath
FROM
  family
ORDER BY
  NodeLevel, NodeId
 
NodeId NodeIdPath NodeIdDisplayPath
0x / 爷爷
0x58 /1/ 爷爷 -> 父亲
0x68 /2/ 爷爷 -> 叔叔
0x5AC0 /1/1/ 爷爷 -> 父亲 -> 长子
0x5B40 /1/2/ 爷爷 -> 父亲 -> 次子
0x5AD6 /1/1/1/ 爷爷 -> 父亲 -> 长子 -> 长孙
0x5B56 /1/2/1/ 爷爷 -> 父亲 -> 次子 -> 长女
0x5B5A /1/2/2/ 爷爷 -> 父亲 -> 次子 -> 次孙


由于叔叔没有子嗣,次子被过继给他.

 

DECLARE @FamilyToMove hierarchyid
DECLARE @OldParent hierarchyid
DECLARE @NewParent hierarchyid

SELECT @FamilyToMove = NodeId
 FROM  family
 WHERE familyId = 113 -- 次子

SELECT @OldParent = NodeId
 FROM  family
 WHERE familyId = 11 -- 父亲

SELECT @NewParent = NodeId
 FROM  family
 WHERE familyId = 13 -- 叔叔

-- 次子过继给叔叔
UPDATE family
 SET   NodeId = @FamilyToMove.GetReparentedValue(@OldParent, @NewParent)
 WHERE NodeId = @FamilyToMove

 SELECT
  NodeId,
  NodeId.ToString() AS NodeIdPath,
  dbo.fnGetFullDisplayPath(NodeId) AS NodeIdDisplayPath
FROM
  family
ORDER BY
  NodeLevel, NodeId
 
NodeId NodeIdPath NodeIdDisplayPath
0x / 爷爷
0x58 /1/ 爷爷 -> 父亲
0x68 /2/ 爷爷 -> 叔叔
0x5AC0 /1/1/ 爷爷 -> 父亲 -> 长子
0x6B40 /2/2/ 爷爷 -> 叔叔 -> 次子
0x5AD6 /1/1/1/ 爷爷 -> 父亲 -> 长子 -> 长孙
0x5B56 /1/2/1/ NULL
0x5B5A /1/2/2/ NULL

结果显示,叔叔过继了次子, 但是, 他的孩子长女,次孙却成了孤儿. ORPHANT NODES.

呵呵, 显然不成功.

这里需要移动整个SUBTREE.

ROLLBACK TRANSCACTION.

 

DECLARE @FamilyToMove hierarchyid
DECLARE @OldParent hierarchyid
DECLARE @NewParent hierarchyid

SELECT @FamilyToMove = NodeId
 FROM  family
 WHERE familyId = 113 -- 次子

SELECT @OldParent = NodeId
 FROM  family
 WHERE familyId = 11 -- 父亲

SELECT @NewParent = NodeId
 FROM  family
 WHERE familyId = 13 -- 叔叔

-- 次子过继给叔叔
UPDATE family
 SET   NodeId = nodeid.GetReparentedValue(@OldParent, @NewParent)
 WHERE NodeId.IsDescendantOf(@FamilyToMove) = 1  -- 注意:ISDESCENDANTOF包括次子本人
       

 SELECT
  NodeId,
  NodeId.ToString() AS NodeIdPath,
  dbo.fnGetFullDisplayPath(NodeId) AS NodeIdDisplayPath
FROM
  family
ORDER BY
  NodeLevel, NodeId
 
NodeId NodeIdPath NodeIdDisplayPath
0x / 爷爷
0x58 /1/ 爷爷 -> 父亲
0x68 /2/ 爷爷 -> 叔叔
0x5AC0 /1/1/ 爷爷 -> 父亲 -> 长子
0x6B40 /2/2/ 爷爷 -> 叔叔 -> 次子
0x5AD6 /1/1/1/ 爷爷 -> 父亲 -> 长子 -> 长孙
0x6B56 /2/2/1/ 爷爷 -> 叔叔 -> 次子 -> 次孙
0x6B5A /2/2/2/ 爷爷 -> 叔叔 -> 次子 -> 长孙女


这次,成了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值