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
Réponses:
La fonction à utiliser est GetReparentedValue mais lorsque vous utilisez uniquement
GetReparentedValue
l'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.
la source
La récupération d'un sous-arbre entier est simple - utilisez la
IsDescendentOf
méthode, selon MSDNL'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.
la source