¿Existe una forma basada en el conjunto para cargar / leer una rama de árbol con HierarchyId

11

Estoy jugando con HierarchyId, y no he descubierto una forma establecida de hacer lo siguiente:

  • inserte todos los subárboles a la vez
  • recuperar todos los subárboles a la vez

Esta pregunta está relacionada con la anterior , y sospecho que la única forma de lograr estas dos tareas con HierarchyId es un nodo o un nivel a la vez. Si estoy usando una ruta materializada, ambas acciones se logran fácilmente mediante un comando único (y trivial) basado en un conjunto.

¿Qué me estoy perdiendo?

Editar: También perdí una forma de mover un subárbol, pero lo aprendí del comentario de Mikael Eriksson

Alaska
fuente
2
¿Has visto esto? Moving Subtrees
Mikael Eriksson
@MikaelEriksson, ¿puedes responder tu comentario?
AK
2
Por supuesto. También expliqué un poco cómo entiendo lo que está sucediendo. Por cierto, solo he probado un poco en HierarchyId, nunca lo usé en producción.
Mikael Eriksson

Respuestas:

5

La función a usar es GetReparentedValue pero cuando se usa solo GetReparentedValueel árbol puede terminar en un estado "inconsistente".

Aquí hay un código proporcionado por Microsoft que se encarga de eso. Subterráneos en movimiento .

Supongo que lo relacionado con esto es hacer cumplir un árbol . Utiliza una columna calculada para la identificación principal que se une automáticamente a la PK.

Mikael Eriksson
fuente
Esta es la mejor respuesta hasta ahora. Desafortunadamente, no veo una manera de insertar / seleccionar un subárbol de más de un nivel en un comando.
AK
3

Recuperar un subárbol completo es simple: use el IsDescendentOfmétodo, según MSDN

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

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

La inserción es más compleja, pero su problema principal será con sus restricciones: obviamente, no puede insertar objetos secundarios hasta que su padre se haya confirmado. En este caso, repita e inserte en orden jerárquico, o desactive las restricciones e inserte.

Al insertar una gran cantidad de datos (migración, inserción por lotes o por lotes, etc.), desactivaba la restricción. Al insertar operacionalmente, iteraría, ya que no he encontrado instancias durante la ejecución del sistema en las que grandes cantidades de grandes necesiten insertarse en la jerarquía.

Kirk Broadhurst
fuente