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
Antworten:
Die zu verwendende Funktion ist GetReparentedValue, aber wenn nur
GetReparentedValue
der 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.
quelle
Das Abrufen eines gesamten Teilbaums ist einfach - verwenden Sie die
IsDescendentOf
Methode gemäß MSDNDas 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.
quelle