我需要从表变量@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的所有文档,也许我遗漏了一些东西,但是我没有看到。
答案 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