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
Odpowiedzi:
Funkcją, której należy użyć, jest GetReparentedValue, ale podczas korzystania tylko
GetReparentedValue
z 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.
źródło
Odzyskiwanie całego poddrzewa jest proste - użyj
IsDescendentOf
metody zgodnie z MSDNWstawianie 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.
źródło