Lezione 1-2: Popolamento di una tabella con dati gerarchici esistentiLesson 1-2 - Populating a Table with Existing Hierarchical Data

Questa attività consente di creare una nuova tabella e popolarla con i dati della tabella EmployeeDemo .This task creates a new table and populates it with the data in the EmployeeDemo table. Questa attività prevede i passaggi seguenti:This task has the following steps:

  • Creare una tabella nuova contenente una colonna hierarchyid .Create a new table that contains a hierarchyid column. Questa colonna può sostituire le colonne EmployeeID e ManagerID esistenti.This column could replace the existing EmployeeID and ManagerID columns. Tuttavia, tali colonne verranno mantenute.However, you will retain those columns. Questo avviene perché le applicazioni esistenti potrebbero riferirsi a tali colonne e potrebbero aiutare a capire i dati dopo il trasferimento.This is because existing applications might refer to those columns, and also to help you understand the data after the transfer. La definizione della tabella specifica che OrgNode è la chiave primaria che richiede alla colonna di contenere i valori univoci.The table definition specifies that OrgNode is the primary key, which requires the column to contain unique values. L'indice cluster della colonna OrgNode archivierà la data nella sequenza OrgNode .The clustered index on the OrgNode column will store the date in OrgNode sequence.

  • Creare una tabella temporanea utilizzata per rilevare il numero di dipendenti che riportano direttamente a ogni responsabile.Create a temporary table that is used to track how many employees report directly to each manager.

  • Popolare la nuova tabella usando i dati dalla tabella EmployeeDemo .Populate the new table by using data from the EmployeeDemo table.

Per creare una nuova tabella denominata NewOrgTo create a new table named NewOrg

  • In una finestra dell'editor di query eseguire il codice seguente per creare una nuova tabella denominata HumanResources.NewOrg:In a Query Editor window, run the following code to create a new table named HumanResources.NewOrg:

    CREATE TABLE NewOrg  
    (  
      OrgNode hierarchyid,  
      EmployeeID int,  
      LoginID nvarchar(50),  
      ManagerID int  
    CONSTRAINT PK_NewOrg_OrgNode  
      PRIMARY KEY CLUSTERED (OrgNode)  
    );  
    GO  
    

Per creare una tabella temporanea denominata #ChildrenTo create a temporary table named #Children

  1. Creare una tabella temporanea denominata #Children con una colonna denominata Num che conterrà il numero di elementi figlio per ogni nodo:Create a temporary table named #Children with a column named Num that will contain the number of children for each node:

    CREATE TABLE #Children   
       (  
        EmployeeID int,  
        ManagerID int,  
        Num int  
    );  
    GO  
    
  2. Aggiungere un indice per accelerare significativamente la query che popola la tabella NewOrg :Add an index that will significantly speed up the query that populates the NewOrg table:

    CREATE CLUSTERED INDEX tmpind ON #Children(ManagerID, EmployeeID);  
    GO  
    

Per popolare la tabella NewOrgTo populate the NewOrg table

  1. Le query ricorsive impediscono le sottoquery con aggregazioni.Recursive queries forbid subqueries with aggregates. In alternativa, popolare la tabella #Children con il codice seguente che usa il metodo ROW_NUMBER() per popolare la colonna Num :Instead, populate the #Children table with the following code, which uses the ROW_NUMBER() method to populate the Num column:

    INSERT #Children (EmployeeID, ManagerID, Num)  
    SELECT EmployeeID, ManagerID,  
      ROW_NUMBER() OVER (PARTITION BY ManagerID ORDER BY ManagerID)   
    FROM EmployeeDemo  
    GO  
    
  2. Rivedere la tabella #Children .Review the #Children table. Si noti in che modo la colonna Num contiene i numeri sequenziali per ogni responsabile.Note how the Num column contains sequential numbers for each manager.

    SELECT * FROM #Children ORDER BY ManagerID, Num  
    GO  
    

    Set di risultati:Here is the result set.

    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

  3. Popolare la tabella NewOrg .Populate the NewOrg table. Usare i metodi GetRoot e ToString per concatenare i valori Num nel formato hierarchyid , quindi aggiornare la colonna OrgNode con i valori di gerarchia risultanti:Use the GetRoot and ToString methods to concatenate the Num values into the hierarchyid format, and then update the OrgNode column with the resultant hierarchical values:

    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  
    GO  
    
  4. Una colonna hierarchyid risulta più comprensibile quando viene convertita in un formato carattere.A hierarchyid column is more understandable when you convert it to character format. Rivedere i dati nella tabella NewOrg eseguendo il codice seguente che contiene due rappresentazioni della colonna OrgNode :Review the data in the NewOrg table by executing the following code, which contains two representations of the OrgNode column:

    SELECT OrgNode.ToString() AS LogicalNode, *   
    FROM NewOrg   
    ORDER BY LogicalNode;  
    GO  
    

    La colonna LogicalNode converte la colonna hierarchyid in un formato di testo più leggibile che rappresenta la gerarchia.The LogicalNode column converts the hierarchyid column into a more readable text form that represents the hierarchy. Nelle attività rimanenti, verrà usato il metodo ToString() per mostrare il formato logico delle colonne hierarchyid .In the remaining tasks, you will use the ToString() method to show the logical format of the hierarchyid columns.

  5. Eliminare la tabella temporanea che non risulta più essere necessaria:Drop the temporary table, which is no longer needed:

    DROP TABLE #Children  
    GO  
    

L'attività successiva creerà indici per supportare la struttura gerarchica.The next task will create indexes to support the hierarchical structure.

Attività successiva della lezioneNext Task in Lesson

Ottimizzazione della tabella NewOrgOptimizing the NewOrg Table