Existe-t-il un moyen basé sur un ensemble de charger / lire une branche d'arbre avec HierarchyId


11

Je joue avec HierarchyId et je n'ai pas trouvé de méthode basée sur un ensemble pour effectuer les opérations suivantes:

  • insérer tous les sous-arbres à la fois
  • récupérer tous les sous-arbres en même temps

Cette question est liée à ma précédente , et je soupçonne que la seule façon d'accomplir ces deux tâches avec HierarchyId est un nœud ou un niveau à la fois. Si j'utilise un chemin matérialisé, les deux actions sont facilement accomplies par une seule commande (et triviale) basée sur un ensemble.

Qu'est-ce que je rate?

Edit: J'ai également manqué un moyen de déplacer un sous-arbre, mais je l'ai appris du commentaire de Mikael Eriksson


2
Avez-vous vu cette? Moving Subtrees
Mikael Eriksson

@MikaelEriksson pouvez-vous faire de votre commentaire une réponse?
AK

2
Sûr. J'ai également expliqué comment je comprends ce qui se passe. BTW, je n'ai testé qu'un peu sur HierarchyId, je ne l'ai jamais utilisé en production.
Mikael Eriksson

Réponses:


5

La fonction à utiliser est GetReparentedValue mais lorsque vous utilisez uniquement GetReparentedValuel'arborescence peut se retrouver dans un état "incohérent".

Voici un code fourni par Microsoft qui s'occupe de cela. Déplacement de sous-arbres .

Je suppose que lié à cela, on applique un arbre . Il utilise une colonne calculée pour l'ID parent qui se joint automatiquement au PK.


C'est la meilleure réponse jusqu'à présent. Malheureusement, je ne vois pas de moyen d'insérer / sélectionner un sous-arbre de plus d'un niveau dans une seule commande.
AK

3

La récupération d'un sous-arbre entier est simple - utilisez la IsDescendentOfméthode, selon MSDN

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

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

L'insertion est plus complexe mais votre problème principal sera avec vos contraintes - vous ne pouvez évidemment pas insérer d'objets enfants jusqu'à ce que leur parent ait été validé. Dans ce cas, itérez et insérez dans l'ordre hiérarchique, ou désactivez les contraintes et insérez.

Lors de l'insertion d'une grande quantité de données - migration, insertion par lots ou en bloc, etc. - je désactiverais la contrainte. Lors de l'insertion opérationnelle, je répéterais, car je n'ai pas rencontré d'instances pendant le fonctionnement du système où de grandes quantités de grandes doivent être insérées dans la hiérarchie.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.