Udostępnij przez


Podczas wypełniania hierarchiczne tabeli za pomocą metody hierarchiczny

AdventureWorks2008R2 ma 8 pracownicy działu marketingu.Hierarchia pracownika wygląda następująco:

David, IDPracownika 6, Menedżer marketingu.Raport trzech specjalistów marketingowych David:

  • Sariya, IDPracownika 46

  • John, IDPracownika 271

  • Jill, IDPracownika 119

Asystent obrotu Wanida (IDPracownika 269), raportów do Sariyai gospodarczego Asystenta Maria (IDPracownika 272), zgłasza Jan.

Aby wstawić katalogu głównegodrzewo hierarchii

  1. Poniższy przykład ilustruje wstawienie David menedżera marketingu do tabela w katalogu głównym hierarchii.OrdLevel kolumna jest kolumna obliczana.Dlatego nie jest częścią instrukcja INSERT.Używa tego pierwszego rekordu GetRoot() metoda, aby wypełnić ten pierwszy rekord jako główny hierarchii.

    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)
    VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ;
    GO
    
  2. Wykonać następujący kod w celu zbadania wstępny wiersz w tabela:

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

    Oto zestaw wyników.

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

Jak w poprzedniej lekcji używamy ToString() metoda konwersji hierarchyid Typ danych do formatu, który jest bardziej zrozumiały.

Aby wstawić podrzędny pracownika

  1. Sariya raportów do David.Aby wstawić Sariya przez węzła, należy utworzyć odpowiednią OrgNode wartość typu danych hierarchyid.Poniższy kod tworzy zmienną typu danych hierarchyid i wypełni je z głównym wartości OrgNode tabela.Then uses that variable with the GetDescendant() method to insert row that is a subordinate node.GetDescendant takes two arguments.Przejrzyj następujące opcje dla wartości argumentu:

    • Jeśli nadrzędny jest NULL, GetDescendant zwraca wartość NULL.

    • Jeśli nadrzędny nie jest NULL, a child1 i child2 ma wartość NULL, GetDescendant zwraca element podrzędność obiektu nadrzędnego.

    • Jeśli nadrzędny i child1 nie mają wartości NULL i child2 jest NULL, GetDescendant zwraca element podrzędność obiektu nadrzędnego jest większa niż child1.

    • Jeśli nadrzędny i child2 nie mają wartości NULL i child1 jest NULL, GetDescendant zwraca element podrzędność obiektu nadrzędnego mniej niż child2.

    • Jeśli wszystkie nadrzędne, child1 i child2 not NULL, GetDescendant zwraca element podrzędność obiektu nadrzędnego większa child1 i mniejsza niż child2.

    Następujący kod używa (NULL, NULL) argumenty głównego nadrzędnym, ponieważ nie ma jeszcze żadnych wierszy w tabela, z wyjątkiem głównego.Wykonać następujący kod do wstawienia 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. Powtórz kwerendy z pierwszej procedury do kwerendy tabela i zobacz, jak pozycje:

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

    Oto zestaw wyników.

    Text_OrgNode OrgNode OrgLevel EmployeeID EmpName Title
    ------------ ------- -------- ---------- ------- -----------------
    /            Ox      0        6          David   Marketing Manager
    /1/          0x58    1        46         Sariya  Marketing Specialist
    

Aby utworzyć procedurę wprowadzania nowych węzłów

  1. W celu uproszczenia wprowadzania danych, należy utworzyć następujące procedura składowana dodać pracowników do EmployeeOrg tabela.Procedura przyjmuje wartości wejściowe o pracowniku dodawany.Obejmuje to IDPracownika z nowego pracownika kierownika, nowego pracownika IDPracownika numer i nazwisko i tytuł.Procedura używa GetDescendant() , a także GetAncestor() metoda.Wykonać następujący kod do procedury tworzenia:

    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. W następującym przykładzie dodano pozostali pracownicy 4, które bezpośrednio lub pośrednio do raportu 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. Ponownie wykonać następującą kwerendę zbadać wierszy w EmployeeOrg tabela:

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

    Oto zestaw wyników.

    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
    

Tabela jest teraz całkowicie wypełniona organizacji Marketing.