Lezione 2-2: Popolamento di una tabella gerarchica tramite metodi gerarchiciLesson 2-2 - Populating a Hierarchical Table Using Hierarchical Methods

AdventureWorks2012AdventureWorks2012 ha 8 dipendenti che lavorano nel reparto Marketing. has 8 employees working in the Marketing department. La gerarchia dei dipendenti è simile alla seguente:The employee hierarchy looks like this:

David, EmployeeID 6 è il responsabile marketing.David, EmployeeID 6, is the Marketing Manager. Tre marketing specialist fanno riferimento a David:Three Marketing Specialists report to David:

  • Sariya, EmployeeID 46Sariya, EmployeeID 46

  • John, EmployeeID 271John, EmployeeID 271

  • Jill, EmployeeID 119Jill, EmployeeID 119

Wanida , Marketing Assistant (EmployeeID 269), fa riferimento a Sariya, mentre Mary Marketing Assistant (EmployeeID 272), fa riferimento a John.Marketing Assistant Wanida (EmployeeID 269), reports to Sariya, and Marketing Assistant Mary (EmployeeID 272), reports to John.

Per inserire la radice dell'albero gerarchicoTo insert the root of the hierarchy tree

  1. Nell'esempio seguente David , il responsabile marketing, è inserito nella tabella alla radice della gerarchia.The following example inserts David the Marketing Manager into the table at the root of the hierarchy. La colonna OrdLevel è una colonna calcolata.The OrdLevel column is a computed column. Pertanto, non è parte dell'istruzione INSERT.Therefore, it is not part of the INSERT statement. Questo primo record usa il metodo GetRoot() per popolarsi come radice della gerarchia.This first record uses the GetRoot() method to populate this first record as the root of the hierarchy.

    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)  
    VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ;  
    GO  
    
  2. Eseguire il seguente codice per esaminare la riga iniziale della tabella:Execute the following code to examine initial row in the table:

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

    Set di risultati:Here is the result set.

    Text_OrgNode OrgNode OrgLevel EmployeeID EmpName Title  
    ------------ ------- -------- ---------- ------- -----------------  
    /            Ox      0        6          David   Marketing Manager  
    

Come illustrato nella lezione precedente, si usa il metodo ToString() per convertire il tipo di dati hierarchyid in un formato più facilmente comprensibile.As in the previous lesson, we use the ToString() method to convert the hierarchyid data type to a format that is more easily understood.

Per inserire un dipendente subordinatoTo insert a subordinate employee

  1. Sariya fa riferimento a David.Sariya reports to David. Per inserire il nodo di Sariya , è necessario creare un valore OrgNode appropriato del tipo di dati hierarchyid.To insert Sariya's node, you must create an appropriate OrgNode value of data type hierarchyid. Il codice seguente crea una variabile di tipo dati hierarchyid e la popola con il valore OrgNode radice della tabella.The following code creates a variable of data type hierarchyid and populates it with the root OrgNode value of the table. A questo punto usa la variabile con il metodo GetDescendant() per inserire la riga che è un nodo subordinato.Then uses that variable with the GetDescendant() method to insert row that is a subordinate node. GetDescendant accetta due argomenti.GetDescendant takes two arguments. Rivedere le opzioni seguenti per i valori dell'argomento:Review the following options for the argument values:

    • Se il padre è NULL, GetDescendant restituisce NULL.If parent is NULL, GetDescendant returns NULL.

    • Se il padre non è NULL e child1 e child2 sono NULL, GetDescendant restituisce un figlio del padre.If parent is not NULL, and both child1 and child2 are NULL, GetDescendant returns a child of parent.

    • Se il padre e child1 non sono NULL e child2 è NULL, GetDescendant restituisce un figlio del padre maggiore di child1.If parent and child1 are not NULL, and child2 is NULL, GetDescendant returns a child of parent greater than child1.

    • Se il padre e child2 non sono NULL e child1 è NULL, GetDescendant restituisce un figlio del padre minore di child2.If parent and child2 are not NULL and child1 is NULL, GetDescendant returns a child of parent less than child2.

    • Se il padre, child1 e child2 non sono NULL, GetDescendant restituisce un figlio del padre maggiore di child1 e uno minore di child2.If parent, child1, and child2 are all not NULL, GetDescendant returns a child of parent greater than child1 and less than child2.

    Il codice seguente utilizza gli argomenti (NULL, NULL) dell'elemento padre radice perché nella tabella non esiste ancora alcuna riga, ad eccezione della radice.The following code uses the (NULL, NULL) arguments of the root parent because there are not yet any rows in the table except the root. Eseguire il codice seguente per inserire Sariya:Execute the following code to insert Sariya:

    DECLARE @Manager hierarchyid   
    SELECT @Manager = hierarchyid::GetRoot()  
    FROM HumanResources.EmployeeOrg ;  
    
    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)  
    VALUES  
    (@Manager.GetDescendant(NULL, NULL), 46, 'Sariya', 'Marketing Specialist') ;  
    
  2. Ripetere la query dalla prima procedura per eseguire una query sulla tabella e verificare come appaiono le voci:Repeat the query from the first procedure to query the table and see how the entries appear:

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

    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  
    

Per creare una procedura per l'immissione di nuovi nodiTo create a procedure for entering new nodes

  1. Per semplificare l'inserimento di dati, creare la stored procedure seguente per aggiungere dipendenti alla tabella EmployeeOrg .To simplify entering data, create the following stored procedure to add employees to the EmployeeOrg table. La procedura accetta valori di input sul dipendente aggiunto.The procedure accepts input values about the employee being added. Include il numero EmployeeID del responsabile del nuovo dipendente, il numero EmployeeID del nuovo dipendente, il nome e il titolo.This includes the EmployeeID of the new employee's manager, the new employee's EmployeeID number, and their first name and title. La procedura usa GetDescendant() e anche il metodo GetAncestor() .The procedure uses GetDescendant() and also the GetAncestor() method. Eseguire il codice seguente per creare la procedura:Execute the following code to create the procedure:

    CREATE PROC AddEmp(@mgrid int, @empid int, @e_name varchar(20), @title varchar(20))   
    AS   
    BEGIN  
       DECLARE @mOrgNode hierarchyid, @lc hierarchyid  
       SELECT @mOrgNode = OrgNode   
       FROM HumanResources.EmployeeOrg   
       WHERE EmployeeID = @mgrid  
       SET TRANSACTION ISOLATION LEVEL SERIALIZABLE  
       BEGIN TRANSACTION  
          SELECT @lc = max(OrgNode)   
          FROM HumanResources.EmployeeOrg   
          WHERE OrgNode.GetAncestor(1) =@mOrgNode ;  
    
          INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)  
          VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name, @title)  
       COMMIT  
    END ;  
    GO  
    
  2. Nell'esempio seguente vengono aggiunti i 4 dipendenti rimanenti che fanno riferimento direttamente o indirettamente a David.The following example adds the remaining 4 employees that report directly or indirectly to David.

    EXEC AddEmp 6, 271, 'John', 'Marketing Specialist' ;  
    EXEC AddEmp 6, 119, 'Jill', 'Marketing Specialist' ;  
    EXEC AddEmp 46, 269, 'Wanida', 'Marketing Assistant' ;  
    EXEC AddEmp 271, 272, 'Mary', 'Marketing Assistant' ;  
    
  3. Eseguire nuovamente la query seguente per esaminare le righe della tabella EmployeeOrg :Again, execute the following query examine the rows in the EmployeeOrg table:

    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  
    /2/          0x68    1        271        John    Marketing Specialist  
    /2/1/        0x6AC0  2        272        Mary    Marketing Assistant  
    /3/          0x78    1        119        Jill    Marketing Specialist  
    

La tabella ora è popolata completamente con l'organizzazione Marketing.The table is now fully populated with the Marketing organization.

Attività successiva della lezioneNext Task in Lesson

Esecuzione di query su una tabella gerarchica utilizzando metodi gerarchiciQuerying a Hierarchical Table Using Hierarchy Methods