Gibt es eine satzbasierte Möglichkeit zum Laden / Lesen eines Baumzweigs mit HierarchyId?

11

Ich spiele mit HierarchyId herum und habe keine satzbasierte Methode gefunden, um Folgendes zu tun:

  • Fügen Sie alle Teilbäume gleichzeitig ein
  • Rufen Sie alle Teilbäume gleichzeitig ab

Diese Frage bezieht sich auf meine vorherige , und ich vermute, dass die einzige Möglichkeit, diese beiden Aufgaben mit HierarchyId auszuführen, jeweils ein Knoten oder eine Ebene ist. Wenn ich einen materialisierten Pfad verwende, können beide Aktionen leicht mit einem einzigen (und trivialen) satzbasierten Befehl ausgeführt werden.

Was vermisse ich?

Bearbeiten: Ich habe auch eine Möglichkeit verpasst, einen Teilbaum zu verschieben, aber ich habe es aus Mikael Erikssons Kommentar gelernt

AK
quelle
2
Hast du das gesehen? Moving Subtrees
Mikael Eriksson
@MikaelEriksson Kannst du deinem Kommentar eine Antwort geben?
AK
2
Sicher. Ich habe auch ein wenig ausgeführt, wie ich verstehe, was los ist. Übrigens habe ich nur ein bisschen auf HierarchyId getestet, es nie in der Produktion verwendet.
Mikael Eriksson

Antworten:

5

Die zu verwendende Funktion ist GetReparentedValue, aber wenn nur GetReparentedValueder Baum verwendet wird, kann dies zu einem "inkonsistenten" Zustand führen.

Hier ist ein Code von Microsoft, der sich darum kümmert. Teilbäume verschieben .

Ich denke, das hängt damit zusammen, einen Baum zu erzwingen . Es wird eine berechnete Spalte für die übergeordnete ID verwendet, die eine Selbstverbindung zur PK herstellt.

Mikael Eriksson
quelle
Dies ist die bisher beste Antwort. Leider sehe ich keine Möglichkeit, einen Teilbaum mit mehr als einer Ebene in einem Befehl einzufügen / auszuwählen.
AK
3

Das Abrufen eines gesamten Teilbaums ist einfach - verwenden Sie die IsDescendentOfMethode gemäß MSDN

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

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

Das Einfügen ist komplexer, aber Ihr Hauptproblem liegt in Ihren Einschränkungen. Sie können offensichtlich keine untergeordneten Objekte einfügen, bis deren übergeordnete Objekte festgeschrieben wurden. In diesem Fall entweder iterieren und in hierarchischer Reihenfolge einfügen oder Einschränkungen deaktivieren und einfügen.

Beim Einfügen einer großen Datenmenge - Migration, Stapel- oder Masseneinfügung usw. - würde ich die Einschränkung deaktivieren. Beim operativen Einfügen würde ich iterieren, da ich beim Ausführen des Systems keine Fälle festgestellt habe, in denen große Mengen großer Mengen in die Hierarchie eingefügt werden müssen.

Kirk Broadhurst
quelle