Populating a Table with Existing Hierarchical Data
To zadanie tworzy nową tabela i wypełnia ją z danymi w HumanResources.EmployeeDemo tabela.To zadanie ma następujące czynności:
Utwórz nową tabela, która zawiera hierarchyid Kolumna. W tej kolumnie można zastąpić istniejącego pliku Pole IDPracownika and ManagerID kolumna.Jednak zachowa tych kolumn.Wynika to z istniejących aplikacji, może odnosić się do tych kolumn, a także ułatwić zrozumienie danych po przeniesieniu.Określa, że definicja tabela OrgNode jest klucz podstawowy, co wymaga kolumna, aby zawierać wartości unikatowe.Indeks klastrowany na OrgNode kolumna będą przechowywane data w OrgNode sekwencji.
Tworzenie tabela tymczasowa, który jest używany do śledzenia liczby pracowników raport bezpośrednio do każdego menedżera.
Nowa tabela należy wypełnić przy użyciu danych z HumanResources.EmployeeDemo tabeli.
Aby utworzyć nową tabela o nazwie NewOrg
W oknie Edytora kwerend uruchom poniższy kod, aby utworzyć nową tabela o nazwie HumanResources.NewOrg:
USE AdventureWorks ; GO CREATE TABLE HumanResources.NewOrg ( OrgNode hierarchyid, EmployeeID int, LoginID nvarchar(50), ManagerID int, Title nvarchar(100), HireDate datetime CONSTRAINT PK_NewOrg_OrgNode PRIMARY KEY CLUSTERED (OrgNode) ) GO
Aby utworzyć tabela tymczasowa o nazwie #Children
Utwórz tabela tymczasowa nazwane Liczba dzieci z kolumną o nazwie Liczba , zawierające liczby dzieci dla każdego węzła:
CREATE TABLE #Children ( EmployeeID int, ManagerID int, Num int ) GO
Dodawanie indeksu, który będzie 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ć Liczba dzieci następujący kod, który używa tabelaROW_NUMBER() Metoda zapełnićLiczba kolumna:
INSERT #Children (EmployeeID, ManagerID, Num) SELECT EmployeeID, ManagerID, ROW_NUMBER() OVER (PARTITION BY ManagerID ORDER BY ManagerID) FROM HumanResources.EmployeeDemo GO
Przegląd Liczba dzieci tabela.Uwaga jak Liczba kolumna zawiera kolejne numery dla każdego menedżera.
SELECT * FROM #Children ORDER BY ManagerID, Num GO
Here is the result set.
EmployeeID ManagerID Num ---------- --------- --- 109 NULL 1 4 3 1 9 3 2 11 3 3 158 3 4 271 6 1 272 6 2
Wypełnianie HumanResources.NewOrg tabela.Użycie GetRoot i ToString metody, aby złączyć Liczba wartości do hierarchyid można sformatować, a następnie zaktualizować OrgNode kolumna z wynikowej wartości hierarchiczne:
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 HumanResources.NewOrg (OrgNode, O.EmployeeID, O.LoginID, O.ManagerID, O.Title, O.HireDate) SELECT P.path, O.EmployeeID, O.LoginID, O.ManagerID, O.Title, O.HireDate FROM HumanResources.EmployeeDemo AS O JOIN Paths AS P ON O.EmployeeID = P.EmployeeID GO
A hierarchyid Kolumna jest bardziej zrozumiały po przekonwertowaniu do formatu znaków. Przejrzyj dane w HumanResources.NewOrg wykonywanie następujący kod, który zawiera dwa reprezentacje tabelaOrgNode kolumna:
SELECT OrgNode.ToString() AS LogicalNode, * FROM HumanResources.NewOrg ORDER BY LogicalNode; GO
The LogicalNode kolumna converts the hierarchyid kolumna into a more readable text form that represents the hierarchy. W pozostałych zadań używane ToString() metoda, aby wyświetlić format logiczny hierarchyid kolumny.
Usuwanie tymczasowej tabela, która nie jest potrzebna:
DROP TABLE #Children GO
Kolejnym zadaniem będzie utworzyć indeksy do obsługi hierarchiczną strukturę.