Popolamento di una tabella con dati gerarchici esistenti
Questa attività crea una tabella nuova e la popola con i dati della tabella HumanResources.EmployeeDemo. Questa attività prevede i passaggi seguenti:
Creare una tabella nuova contenente una colonna hierarchyid. Questa colonna ha sostituito le colonne EmployeeID e ManagerID esistenti. Tuttavia, tali colonne verranno mantenute. Questo avviene perché le applicazioni esistenti potrebbero riferirsi a tali colonne e potrebbero aiutare a capire i dati dopo il trasferimento. La definizione della tabella specifica che OrgNode è la chiave primaria che richiede alla colonna di contenere i valori univoci. L'indice cluster della colonna OrgNode archivierà la data in sequenza di OrgNode.
Creare una tabella temporanea utilizzata per rilevare il numero di dipendenti che riportano direttamente a ogni responsabile.
Popolare la nuova tabella utilizzando i dati dalla tabella HumanResources.EmployeeDemo.
Per creare una nuova tabella denominata NewOrg
In una finestra editor di query, eseguire il codice seguente per creare una nuova tabella denominata 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
Per creare una tabella temporanea denominata #Figli
Creare una tabella temporanea denominata #Figli con una colonna denominata Num che conterrà il numero di elementi figlio per ogni nodo:
CREATE TABLE #Children ( EmployeeID int, ManagerID int, Num int ) GOAggiungere un indice per accelerare significativamente la query che popola la tabella NewOrg:
CREATE CLUSTERED INDEX tmpind ON #Children(ManagerID, EmployeeID) GO
Per popolare la tabella NewOrg
Le query ricorsive impediscono le sottoquery con aggregazioni. Invece, popolare la tabella #Figli con il codice seguente che utilizza il metodo ROW_NUMBER () per popolare la colonna Num:
INSERT #Children (EmployeeID, ManagerID, Num) SELECT EmployeeID, ManagerID, ROW_NUMBER() OVER (PARTITION BY ManagerID ORDER BY ManagerID) FROM HumanResources.EmployeeDemo GOControllare la tabella #Figli. Si noti in che modo la colonna Num contiene i numeri sequenziali per ogni responsabile.
SELECT * FROM #Children ORDER BY ManagerID, Num GOSet di risultati:
EmployeeID ManagerID Num ---------- --------- --- 109 NULL 1 4 3 1 9 3 2 11 3 3 158 3 4 271 6 1 272 6 2Popolare la tabella HumanResources.NewOrg. Utilizzare i metodi GetRoot e ToString per concatenare i valori Num nel formato hierarchyid, quindi aggiornare la colonna OrgNode con i valori gerarchici risultanti:
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 GOUna colonna hierarchyid è più comprensibile quando viene convertita in un formato carattere. Controllare i dati nella tabella HumanResources.NewOrg eseguendo il codice seguente che contiene due rappresentazioni della colonna OrgNode:
SELECT OrgNode.ToString() AS LogicalNode, * FROM HumanResources.NewOrg ORDER BY LogicalNode; GOLa colonna LogicalNode converte la colonna hierarchyid in un modulo di testo più leggibile che rappresenta la gerarchia. Nelle attività rimanenti, si utilizzerà il metodo ToString() per mostrare il formato logico delle colonne hierarchyid.
Eliminare la tabella temporanea che non risulta più essere necessaria:
DROP TABLE #Children GO
L'attività successiva creerà indici per supportare la struttura gerarchica.