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/ 爷爷 -> 叔叔 -> 次子 -> 长孙女
这次,成了.