Aracılığıyla paylaş


Hiyerarşik yöntemleri kullanarak hiyerarşik bir tablo doldurma

AdventureWorks2012 8 çalışanların pazarlama departmanı vardır. Çalışan hiyerarşi şuna benzer:

David, EmployeeID 6, pazarlama yöneticisidir. Üç pazarlama uzmanları bildirmek için David:

  • Sariya, EmployeeID 46

  • John, EmployeeID 271

  • Jill, EmployeeID 119

Pazarlama Yardımcısı Wanida (EmployeeID 269), raporlar Sariyave pazarlama Yardımcısı Mary (EmployeeID 272), raporlar John.

Sıradüzen ağacının kökünü eklemek için

  1. Aşağıdaki örnek ekler David içine hiyerarşisinin kökü masada Pazarlama Müdürü. OrdLevel hesaplanmış bir sütun sütundur. Bu nedenle, INSERT deyimi bir parçası değildir. Bu ilk kaydı kullanır GetRoot() bu ilk kaydı hiyerarşisinin kökü doldurmak için yöntem.

    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)
    VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ;
    GO
    
    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)
    VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ;
    GO
    
  2. Tablodaki ilk satır incelemek için aşağıdaki kod yürütün:

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

    Sonuç kümesi buradadır.

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

Önceki derste olarak kullandığımız ToString()dönüştürmek için yöntem hierarchyidveri türü daha kolay anlaşılır bir biçime.

Bağımlı bir çalışan eklemek için

  1. Sariya raporları David. Eklemek için Sariya's düğüm, oluşturmanız gerekir uygun bir = OrgNode veri türü değeri hierarchyid. Aşağıdaki kod, veri türünde bir değişken oluşturur hierarchyidve kök OrgNode değeri tablo doldurur. Bu değişkenle kullanır GetDescendant() bir alt düğüm satır ekleme yöntemi. GetDescendantiki bağımsız değişken alır. Bağımsız değişken değerleri aşağıdaki seçenekleri gözden geçirin:

    • Üst null ise GetDescendantnull döndürüyor.

    • Üst null olmaması ve child1 ve alt2 null, GetDescendantbir alt döndürür.

    • Üst ve child1 null olmayan ve alt2 null, GetDescendantbir alt child1 büyüktür döndürür.

    • Üst ve alt2 null olmayan ve null child1 ise GetDescendantbir alt alt2 daha az döndürür.

    • Eğer üst, child1 ve alt2 tüm not null, GetDescendantbir alt büyüktür child1 ve alt2 daha az döndürür.

    Aşağıdaki kodu kullanır (NULL, NULL)bağımsız kök ana tablodaki tüm satırların kök hariç değil henüz çünkü. Eklemek için aşağıdaki kodu yürütün 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') ; 
    
    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. Sorgudan tablo sorgulamak ve girişleri nasıl görüneceğini görmek için ilk yordamı yineleyin:

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

    Sonuç kümesi buradadır.

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

Yeni düğümler girmek için bir yordam oluşturmak için

  1. Girerek verileri basitleştirmek, aşağıdaki oluşturmak için depolanan yordamı çalışanlara eklemek EmployeeOrg tablosu. Yordam eklenmesini çalışan hakkında giriş değerleri kabul eder. Bu EmployeeID yeni çalışanın Yöneticisi, yeni işçi 's EmployeeID numarası ve ad ve başlık. Yordam GetDescendant()da GetAncestor() yöntemi. Yordamı oluşturmak için aşağıdaki kod yürütün:

    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
    
    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. Aşağıdaki örnek, doğrudan veya dolaylı olarak rapor kalan 4 çalışanlar ekler 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' ;
    
    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. Yine, aşağıdaki sorguyu yürütün satırları incelemek EmployeeOrg tablosu:

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

    Sonuç kümesi buradadır.

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

Tabloyu şimdi tamamen pazarlama organizasyonu ile doldurulur.

Ders sonraki görev

Hiyerarşi yöntemleri kullanarak hiyerarşik bir tablo sorgulama