SQL Server HierarchyID:如何在不知道孩子ID的情况下添加孩子?

问题描述 投票:0回答:2

从表变量@Toc我需要将内容插入表PE_TableOfContents,它具有HIERARCHYID。在PE_TableOfContents中将有一个根项目。从那个根项目,我可以获得根HIERARCHYID(@rootNode)。

但是当我去插入子项时,我不确定如何创建新的HIERARCHYID,因为在插入之后我才知道该列的ID。

DECLARE @rootNode HIERARCHYID = (SELECT tocNode from PE_TableOfContents WHERE TocNodeLevel = 0)

INSERT INTO PE_TableOfContents (
    TocNode,
    ... all of the other columns)
SELECT 
    @rootNode.ToString + ???? + '/',
    T... all of the other columns
FROM 
    @Toc T

我正在查看hierarchyid的所有文档,也许我错过了一些东西,但我没有看到这个。

sql-server sql-server-2017
2个回答
1
投票

关于HierarchyID的文档中没有立即明显的一点是,您可以自由地指定您想要的任何数字数据作为路径的组成部分。我个人喜欢使用自动生成的ID(无论是身份值还是其他)。我还想把ParentID之类的东西放在表中作为一个列,这样如果为了使hierarchyid列保持最新而横向移动,你可以使用递归查询来重新生成它(也就是说hierarchyid列是派生数据只有助于查询性能)。

为了明确,假设我有下表:

ID      ParentID
================
100       NULL
200       100
300       100
400       200

我会像这样派生hierarchyid列:

ID      ParentID   h
=========================
100       NULL     /100/
200       100      /100/200
300       100      /100/300
400       200      /100/200/400

如果您使用标识列,我无法想到一种方法来执行此操作,而不首先使用null值为hierarchyid插入行。如果您使用序列来分配ID,则可以从序列中获取值,并将其用于ID值并派生hierarchyid。


0
投票

好吧,经过足够的谷歌搜索,我found a good explanation

首先,获取根(或父)节点:

DECLARE @rootNode HIERARCHYID = (SELECT tocNode FROM PE_TableOfContents WHERE TocNodeLevel = 0)

然后,获取该根(或父)节点的最后一个已知子节点:

DECLARE @lastNode HIERARCHYID = (SELECT MAX(tocNode) FROM PE_TableOfContents WHERE tocNode.GetAncestor(1) = @rootNode);

然后执行如下插入:

INSERT INTO PE_TableOfContents (
    TocNode,
    ... all of the other columns)
SELECT         
    @rootNode.GetDescendant(@lastNode, NULL),
    T... all of the other columns
FROM 
    @Toc T
© www.soinside.com 2019 - 2024. All rights reserved.