Udostępnij przez


Zmiana kolejności danych w tabeli hierarchiczne hierarchiczne metod

Reorganizowanie hierarchii jest typowe zadanie konserwacji.W tym zadaniu, możemy użyć aktualizacji instrukcja z GetReparentedValue metoda najpierw przenieść do nowej lokalizacji w hierarchii pojedynczego wiersza.Następnie możemy spowoduje przeniesienie całego poddrzewa do nowej lokalizacji.

GetReparentedValue Metoda przyjmuje dwa argumenty.Pierwszy argument opisuje część hierarchii do zmodyfikowania.Na przykład, jeśli hierarchia jest /1/4/2/3/ i chcesz zmienić /1/4/ sekcji, że hierarchia staje się /2/1/2/3/, pozostawiając ostatnich dwóch węzłów (2 i 3/) bez zmian, należy podać zmienianie węzłów (/1/4/) jako pierwszy argument.Drugi argument udostępnia nowy poziom hierarchii w naszym przykładzie /2/1/.Dwa argumenty musi zawierać tę samą liczbę poziomów.

Aby przenieść jeden wiersz do nowej lokalizacji w hierarchii

  1. Obecnie Wanida raportów do Sariya.W tej procedurze przeniesieniu z jej bieżącego węzła Wanida /1/1/ , dzięki czemu użytkownik zgłasza Jill.Jej nowy węzeł stanie się /3/1/ , /1/ jest pierwszym argumentem i /3/ jest drugim.Odpowiadają one OrgNode wartości Sariya i Jill.Wykonać następujący kod, aby przenieść Wanida z firmy Sariya organizacji firmy Jill:

    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. Wykonać następujący kod, aby zobaczyć wynik:

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

    Wanida jest teraz w węźle /3/1/.

Do reorganizowania części hierarchii

  1. Wykazanie, jak przenieść większej liczby osób, w tym samym czas, najpierw wykonać następujący kod w celu dodawania intern zgłoszenie do Wanida:

    EXEC AddEmp 269, 291, 'Kevin', 'Marketing Intern'  ;
    GO
    
  2. Teraz Tomasz raportów do Wanida, Jill, który zgłasza David podwładnych.Oznacza to, że Piotr jest poziom /3/1/1/ .Aby przenieść wszystkie Jill jego podwładnych Nowy Menedżer, firma Microsoft zaktualizuje wszystkie węzły z /3/ jako ich OrgNode nową wartość.Wykonać następujący kod do aktualizacji Wanida sprawozdania Sariya, ale opuszczania Tomasz zgłoszenie do 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. Wykonać następujący kod, aby zobaczyć wynik:

    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
/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

Całe drzewo organizacyjnych, które były zgłaszane Jill (Wanida i Jan) teraz raporty Sariya.

Dla procedura składowana do reorganizowania sekcji hierarchii zobacz "Przenoszenie poddrzew" sekcja Praca z hierarchyid danych.