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

时间:2019-04-09 18:45:14

标签: sql-server sql-server-2017

我需要从表变量@Toc中插入内容到具有HIERARCHYID的表PE_TableOfContents中。在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的所有文档,也许我遗漏了一些东西,但是我没有看到。

2 个答案:

答案 0 :(得分:1)

关于HierarchyID的文档并没有立即显而易见的一件事是,您可以自由指定要用作路径组成部分的任何数字数据。我个人喜欢使用自动生成的ID(无论是身份值还是其他值)。我还喜欢将ParentID之类的内容作为表中的一列,这样,如果在保持hierarchyid列为最新状态方面有些偏颇,则可以使用递归查询来重新生成它(即architectureid列是仅用于帮助提高查询性能的派生数据。

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

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。

答案 1 :(得分:0)

好的,经过足够的Google搜索,我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