有没有一种基于集合的方式来加载/读取带有HierarchyId的树枝


11

我正在玩HierarchyId,但还没有想出一种基于集合的方法来执行以下操作:

  • 一次插入所有子树
  • 一次检索所有子树

这个问题与我的上一个问题有关,我怀疑用HierarchyId完成这两项任务的唯一方法是一次一个节点或一个级别。如果我使用的是物化路径,则可以通过一个(且不重要的)基于集合的命令轻松地完成这两个动作。

我想念什么?

编辑:我也错过了一种移动子树的方法,但我从Mikael Eriksson的评论中学到了


2
你见过这个吗?移动子树
Mikael Eriksson,

@MikaelEriksson您可以将您的评论作为答案吗?
AK 2012年

2
当然。我还详细说明了如何理解正在发生的事情。顺便说一句,我只对HierarchyId进行了测试,从未在生产中使用过。
Mikael Eriksson

Answers:


5

要使用的函数是GetReparentedValue,但仅GetReparentedValue使用树时可能会以“不一致”状态结束。

这是Microsoft提供的一些代码来解决这一问题。移动子树

我想与此相关的是强制执行树。它使用计算所得的列作为父ID并与PK进行自我连接。


到目前为止,这是最好的答案。不幸的是,我没有看到一种在一个命令中插入/选择一个以上级别的子树的方法。
AK 2012年

3

检索整个子树很简单- IsDescendentOf按照MSDN使用方法

DECLARE @Manager hierarchyid
SELECT @Manager = OrgNode FROM HumanResources.EmployeeDemo
  WHERE LoginID = 'adventure-works\dylan0'

SELECT * FROM HumanResources.EmployeeDemo
WHERE OrgNode.IsDescendantOf(@Manager) = 1

插入更为复杂,但是主要的问题是约束条件-很明显,只有在提交了父对象之后才能插入子对象。在这种情况下,要么按层次结构顺序迭代并插入,要么关闭约束并插入。

当插入大量数据时-迁移,批处理或批量插入等-我会关闭约束。在进行操作性插入时,我会进行迭代,因为在系统运行期间没有遇到需要将大量大型对象插入层次结构的实例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.