Lezione 2-4: Riordinamento di dati in una tabella gerarchica tramite metodi gerarchiciLesson 2-4 - Reordering Data in a Hierarchical Table Using Hierarchical Methods

La riorganizzazione di una gerarchia è un'attività di manutenzione comune.Reorganizing a hierarchy is a common maintenance task. In questa attività verrà usata un'istruzione UPDATE con il metodo GetReparentedValue per spostare innanzitutto una singola riga in un percorso nuovo della gerarchia.In this task, we will use an UPDATE statement with the GetReparentedValue method to first move a single row to a new location in the hierarchy. Verrà quindi spostato un sottoalbero intero in un nuovo percorso.Then we will move an entire sub-tree to a new location.

Il metodo GetReparentedValue utilizza due argomenti.The GetReparentedValue method takes two arguments. Nel primo argomento viene descritta la parte della gerarchia da modificare.The first argument describes the part of the hierarchy to be modified. Ad esempio, se una gerarchia è /1/4/2/3/ e si vuole modificare la sezione /1/4/ , la gerarchia diventa /2/1/2/3/, lasciando gli ultimi due nodi (2/3/) inalterati, è necessario specificare i nodi modificati (/1/4/) come primo argomento.For example, if a hierarchy is /1/4/2/3/ and you want to change the /1/4/ section, the hierarchy becomes /2/1/2/3/, leaving the last two nodes (2/3/) unchanged, you must provide the changing nodes (/1/4/) as the first argument. Il secondo argomento specifica il nuovo livello della gerarchia, nell'esempio /2/1/.The second argument provides the new hierarchy level, in our example /2/1/. Non è necessario che i due argomenti contengano lo stesso numero di livelli.The two arguments do not have to contain the same number of levels.

Per spostare una sola riga in un percorso nuovo nella gerarchiaTo move a single row to a new location in the hierarchy

  1. Attualmente Wanida riporta a Sariya.Currently Wanida reports to Sariya. In questa procedura, si sposta Wanida dal nodo corrente /1/1/, in modo che riporti a Jill.In this procedure, you move Wanida from her current node /1/1/, so that she reports to Jill. Il suo nodo nuovo diventerà /3/1/ e /1/ diventa il primo argomento, mentre /3/ diventa il secondo argomento.Her new node will become /3/1/ so /1/ is the first argument and /3/ is the second. Gli argomenti corrispondono ai valori OrgNode di Sariya e Jill.These correspond to the OrgNode values of Sariya and Jill. Eseguire il codice seguente per spostare Wanida dall'organizzazione di Sariya a quella di Jill:Execute the following code to move Wanida from Sariya's organization to Jill's:

    DECLARE @CurrentEmployee hierarchyid , @OldParent hierarchyid, @NewParent hierarchyid  
    SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg  
      WHERE EmployeeID = 269 ;   
    SELECT @OldParent = OrgNode FROM HumanResources.EmployeeOrg  
      WHERE EmployeeID = 46 ;   
    SELECT @NewParent = OrgNode FROM HumanResources.EmployeeOrg  
      WHERE EmployeeID = 119 ;   
    
    UPDATE HumanResources.EmployeeOrg  
    SET OrgNode = @CurrentEmployee. GetReparentedValue(@OldParent, @NewParent)   
    WHERE OrgNode = @CurrentEmployee ;  
    GO  
    
  2. Eseguire il codice seguente per visualizzare il risultato:Execute the following code to see the result:

    SELECT OrgNode.ToString() AS Text_OrgNode,   
    OrgNode, OrgLevel, EmployeeID, EmpName, Title   
    FROM HumanResources.EmployeeOrg ;  
    GO  
    

    Wanida ora è al nodo /3/1/.Wanida is now at node /3/1/.

Per riorganizzare una sezione di una gerarchiaTo reorganize a section of a hierarchy

  1. Per dimostrare come spostare contemporaneamente un numero maggiore di persone, eseguire innanzitutto il codice seguente per aggiungere un report del tirocinante a Wanida:To demonstrate how to move a larger number of people at the same time, first execute the following code to add an intern reporting to Wanida:

    EXEC AddEmp 269, 291, 'Kevin', 'Marketing Intern'  ;  
    GO  
    
  2. Ora Kevin riporta a Wanida che riporta a Jill che riporta a David.Now Kevin reports to Wanida, who reports to Jill, who reports to David. Questo significa che Kevin è al livello /3/1/1/.That means that Kevin is at level /3/1/1/. Per spostare tutti i subalterni di Jill a un nuovo responsabile, verranno aggiornati tutti i nodi che hanno /3/ in OrgNode con un nuovo valore.To move all of Jill's subordinates to a new manager, we will update all nodes that have /3/ as their OrgNode to a new value. Eseguire il codice seguente per aggiornare Wanida in modo che riporti a Sariya, ma lasciando che Kevin riporti a Wanida:Execute the following code to update Wanida to report to Sariya, but keep Kevin reporting to Wanida:

    DECLARE @OldParent hierarchyid, @NewParent hierarchyid  
    SELECT @OldParent = OrgNode FROM HumanResources.EmployeeOrg  
    WHERE EmployeeID = 119 ; -- Jill  
    SELECT @NewParent = OrgNode FROM HumanResources.EmployeeOrg  
    WHERE EmployeeID = 46 ; -- Sariya  
    DECLARE children_cursor CURSOR FOR  
    SELECT OrgNode FROM HumanResources.EmployeeOrg  
    WHERE OrgNode.GetAncestor(1) = @OldParent;  
    DECLARE @ChildId hierarchyid;  
    OPEN children_cursor  
    FETCH NEXT FROM children_cursor INTO @ChildId;  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
    START:  
        DECLARE @NewId hierarchyid;  
        SELECT @NewId = @NewParent.GetDescendant(MAX(OrgNode), NULL)  
        FROM HumanResources.EmployeeOrg WHERE OrgNode.GetAncestor(1) = @NewParent;  
    
        UPDATE HumanResources.EmployeeOrg  
        SET OrgNode = OrgNode.GetReparentedValue(@ChildId, @NewId)  
        WHERE OrgNode.IsDescendantOf(@ChildId) = 1;  
        IF @@error <> 0 GOTO START -- On error, retry  
            FETCH NEXT FROM children_cursor INTO @ChildId;  
    END  
    CLOSE children_cursor;  
    DEALLOCATE children_cursor;  
    
  3. Eseguire il codice seguente per visualizzare il risultato:Execute the following code to see the result:

    SELECT OrgNode.ToString() AS Text_OrgNode,   
    OrgNode, OrgLevel, EmployeeID, EmpName, Title   
    FROM HumanResources.EmployeeOrg ;  
    GO  
    

Set di risultati:Here is the result set.

Text_OrgNode OrgNode OrgLevel EmployeeID EmpName Title  
------------ ------- -------- ---------- ------- -----------------  
/            Ox      0        6          David   Marketing Manager  
/1/          0x58    1        46         Sariya  Marketing Specialist  
/1/1/        0x5AC0  2        269        Wanida  Marketing Assistant  
/1/1//2      0x5AD0  3        291        Kevin   Marketing Intern  
/2/          0x68    1        271        John    Marketing Specialist  
/2/1/        0x6AC0  2        272        Mary    Marketing Assistant  
/3/          0x78    1        119        Jill    Marketing Specialist  

L'intero albero organizzativo che riportava a Jill (Wanida e Kevin) ora riporta a Sariya.The entire organizational tree that had reported to Jill (both Wanida and Kevin) now reports to Sariya.

Per riorganizzare una sezione di una gerarchia tramite una stored procedure, vedere la sezione Spostamento di sottoalberi.For a stored procedure to reorganize a section of a hierarchy, see the "Moving Subtrees" section of Moving Subtrees.

Attività successiva della lezioneNext Task in Lesson

Riepilogo: Gestione di dati in una tabella gerarchicaSummary: Managing Data in a Hierarchical Table