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