首页 > 解决方案 > 如何复制hierarchyid子树

问题描述

我想复制一个子树,例如

在此处输入图像描述

进入同一张表,在下一个最右边的空闲位置(在本例中为 /5/...)。

是否有任何存储过程可以帮助我做到这一点?如果没有:我该怎么做?

我对 SQL 比较陌生,因此我们将不胜感激。

标签: sql-servertsqlhierarchyid

解决方案


这些值看起来像hierarchyid值,这使得这相当容易。这是我想出的:

declare @foo table (
    h hierarchyid
);

insert into @foo (h)
values
    ('/4/1/'),
    ('/4/1/1/'),
    ('/4/1/1/6/'),
    ('/4/1/1/7/');

select h.ToString(), 
    h.GetReparentedValue('/4/', '/5/').ToString()
from @foo;

前两个语句只是设置(顺便说一句,如果您自己提供,这将使您在此处提出的未来问题更有可能得到回答!)。最后一位显示将子树移动到新的父级。

为了避免硬编码/5/,我想出了这个(基于与上面相同的设置):

declare @root hierarchyid = '/';
select @root.GetDescendant(
        max(h).GetAncestor(
            max(h).GetLevel()-1),
            NULL
        ).ToString()
from @foo;

这是一个明智的猜测,因为我不知道您的实际数据。但这应该会让你走得很远。

最后,要实际更改您的数据以反映我选择的值,您必须运行一个update语句。我会把它留给你。


推荐阅读