Czy istnieje oparty na zestawie sposób ładowania / odczytu gałęzi drzewa za pomocą HierarchyId

11

Bawię się z HierarchyId i nie opracowałem metody opartej na zestawie, aby wykonać następujące czynności:

  • wstaw wszystkie poddrzewa jednocześnie
  • pobierz wszystkie poddrzewa jednocześnie

To pytanie dotyczy mojego poprzedniego i podejrzewam, że jedynym sposobem na wykonanie tych dwóch zadań za pomocą HierarchyId jest jeden węzeł lub jeden poziom na raz. Jeśli używam zmaterializowanej ścieżki, oba działania można łatwo wykonać za pomocą pojedynczego (i trywialnego) polecenia opartego na zestawie.

czego mi brakuje?

Edycja: Brakowało mi także sposobu na przeniesienie poddrzewa, ale nauczyłem się go z komentarza Mikaela Erikssona

AK
źródło
2
Widziałeś to? Moving Subtrees
Mikael Eriksson
@MikaelEriksson, czy możesz zamieścić komentarz w odpowiedzi?
AK
2
Pewnie. Rozbudowałem też trochę, w jaki sposób rozumiem, co się dzieje. BTW, przetestowałem tylko trochę na HierarchyId, nigdy nie użyłem go w produkcji.
Mikael Eriksson

Odpowiedzi:

5

Funkcją, której należy użyć, jest GetReparentedValue, ale podczas korzystania tylko GetReparentedValuez drzewa może dojść do „niespójnego” stanu.

Oto niektóre kody dostarczone przez Microsoft, które się tym zajmują. Przenoszenie poddrzewa .

Myślę, że związane z tym jest wymuszanie drzewa . Używa kolumny obliczeniowej dla identyfikatora nadrzędnego, który wykonuje samodzielne połączenie z PK.

Mikael Eriksson
źródło
To najlepsza jak dotąd odpowiedź. Niestety nie widzę sposobu wstawiania / wybierania poddrzewa o więcej niż jednym poziomie w jednym poleceniu.
AK
3

Odzyskiwanie całego poddrzewa jest proste - użyj IsDescendentOfmetody zgodnie z MSDN

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

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

Wstawianie jest bardziej złożone, ale twoim głównym problemem będą ograniczenia - oczywiście nie możesz wstawiać obiektów potomnych, dopóki ich rodzic nie zostanie zatwierdzony. W takim przypadku albo iteruj i wstawiaj w kolejności hierarchicznej, albo wyłącz ograniczenia i wstawiaj.

Wstawiając dużą ilość danych - migrację, wsad wsadowy lub zbiorczy itp. - wyłączyłem ograniczenie. Wstawiając operacyjnie, iterowałbym, ponieważ podczas pracy systemu nie spotkałem się z wystąpieniami, w których duże ilości dużych muszą zostać wstawione do hierarchii.

Kirk Broadhurst
źródło