我正在玩 HierarchyId,但我还没有想出一种基于集合的方法来执行以下操作:
- 一次插入所有子树
- 一次检索所有子树
这个问题与我之前的问题有关,我怀疑使用 HierarchyId 完成这两个任务的唯一方法是一次一个节点或一个级别。如果我使用的是物化路径,这两个操作都可以通过一个(简单的)基于集合的命令轻松完成。
我错过了什么?
编辑:我也错过了移动子树的方法,但我是从 Mikael Eriksson 的评论中学到的
我正在玩 HierarchyId,但我还没有想出一种基于集合的方法来执行以下操作:
这个问题与我之前的问题有关,我怀疑使用 HierarchyId 完成这两个任务的唯一方法是一次一个节点或一个级别。如果我使用的是物化路径,这两个操作都可以通过一个(简单的)基于集合的命令轻松完成。
我错过了什么?
编辑:我也错过了移动子树的方法,但我是从 Mikael Eriksson 的评论中学到的
要使用的函数是GetReparentedValue,但仅
GetReparentedValue
使用树时可能会处于“不一致”状态。这是 Microsoft 提供的一些代码,用于处理此问题。移动子树。
我想与此相关的是Enforcing a tree。它为执行自连接到 PK 的父 ID 使用计算列。
检索整个子树很简单 - 使用
IsDescendentOf
方法,按照MSDN插入更复杂,但你的主要问题将与你的约束有关——你显然不能插入子对象,直到它们的父对象被提交。在这种情况下,要么按层次顺序迭代和插入,要么关闭约束并插入。
当插入大量数据时——迁移、批量或批量插入等——我会关闭约束。在操作插入时,我会进行迭代,因为我在系统运行期间没有遇到过需要将大量 large 插入到层次结构中的实例。