从表变量@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的所有文档,也许我错过了一些东西,但我没有看到这个。
关于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。
好吧,经过足够的谷歌搜索,我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