Wypełnianie tabeli z istniejącymi danymi hierarchicznymi
To zadanie tworzy nową tabela i wypełni je z danymi w EmployeeDemo tabela.To zadanie ma następujące czynności:
Utwórz nową tabela zawierającą hierarchyid kolumna.W tej kolumnie można zastąpić istniejące IDPracownika i ManagerID kolumna.Jednakże zachowa tych kolumn.Wynika to z istniejących aplikacji może odnosić się do tych kolumn i ułatwić zrozumienie danych po przeniesieniu.Definicja tabela określa, że OrgNode jest klucz podstawowy, co wymaga kolumna zawiera wartości unikatowych.Indeks klastrowany na OrgNode kolumna będą przechowywane data w OrgNode sekwencji.
Tworzenie tabela tymczasowa , jest używany do śledzenia, ilu pracowników raport bezpośrednio do każdego menedżera.
Wypełnianie nowej tabela przy użyciu danych z EmployeeDemo tabela.
Aby utworzyć nową tabela o nazwie NewOrg
W oknie Edytora kwerend uruchom poniższy kod, aby utworzyć nową tabela o nazwie HumanResources.NewOrg:
CREATE TABLE NewOrg ( OrgNode hierarchyid, EmployeeID int, LoginID nvarchar(50), ManagerID int CONSTRAINT PK_NewOrg_OrgNode PRIMARY KEY CLUSTERED (OrgNode) ); GO
Aby utworzyć tabela tymczasowa o nazwie #Children
Tworzenie tabela tymczasowa o nazwie #Children z kolumną o nazwie Num , będzie zawierać liczby dzieci dla każdego węzła:
CREATE TABLE #Children ( EmployeeID int, ManagerID int, Num int ); GODodawanie indeksu znacznie przyspieszyć kwerendę, która wypełnia NewOrg tabela:
CREATE CLUSTERED INDEX tmpind ON #Children(ManagerID, EmployeeID); GO
Aby wypełnić tabela NewOrg
Kwerendy cykliczne Zabroń podkwerend z agregatów.Zamiast tego należy wypełnić #Children tabela następujący kod, który używa ROW_NUMBER() metoda do wypełniania Num kolumna:
INSERT #Children (EmployeeID, ManagerID, Num) SELECT EmployeeID, ManagerID, ROW_NUMBER() OVER (PARTITION BY ManagerID ORDER BY ManagerID) FROM EmployeeDemo GOPrzegląd #Children tabela.Uwaga jak Num kolumna zawiera kolejne numery dla każdego menedżera.
SELECT * FROM #Children ORDER BY ManagerID, Num GOOto zestaw wyników.
EmployeeID ManagerID Num
---------- --------- ---
1 NULL 1
2 1 1
3 1 2
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 4 1
10 4 2
Wypełnianie NewOrg tabela.Użyj GetRoot i ToString metody łączenia Num wartości do hierarchyid format, a następnie zaktualizuj OrgNode kolumna z wynikowego hierarchicznych wartości:
WITH paths(path, EmployeeID) AS ( -- This section provides the value for the root of the hierarchy SELECT hierarchyid::GetRoot() AS OrgNode, EmployeeID FROM #Children AS C WHERE ManagerID IS NULL UNION ALL -- This section provides values for all nodes except the root SELECT CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid), C.EmployeeID FROM #Children AS C JOIN paths AS p ON C.ManagerID = P.EmployeeID ) INSERT NewOrg (OrgNode, O.EmployeeID, O.LoginID, O.ManagerID) SELECT P.path, O.EmployeeID, O.LoginID, O.ManagerID FROM EmployeeDemo AS O JOIN Paths AS P ON O.EmployeeID = P.EmployeeID GOA hierarchyid kolumna jest bardziej zrozumiałe, podczas konwersji do formatu znaku.Przejrzyj dane w NewOrg tabela przez wykonywanie poniższy kod zawiera dwie reprezentacje OrgNode kolumna:
SELECT OrgNode.ToString() AS LogicalNode, * FROM NewOrg ORDER BY LogicalNode; GOLogicalNode konwertuje kolumna hierarchyid kolumna do bardziej czytelny formularza tekst reprezentująca hierarchii.W pozostałych zadań będzie używać ToString() metoda pokazać format logiczny hierarchyid kolumny.
Upuść tabela tymczasowa, który nie jest już potrzebna:
DROP TABLE #Children GO
Następnego zadania spowoduje utworzenie indeksów do obsługi strukturę hierarchiczną.