Aracılığıyla paylaş


Sıradüzensel yöntemleri kullanarak hiyerarşik bir tablo doldurma

AdventureWorks Pazarlama bölümünde 8 çalışanların vardır.Çalışan hiyerarşisi aşağıdaki gibidir:

David, ÇalışanNo 6, pazarlama yöneticisi olan.Üç pazarlama Specialists rapor David:

  • Sariya, ÇalışanNo 46

  • Gamze, ÇalışanNo 271

  • Jill, ÇalışanNo 119

Pazarlama yardımcı Wanida (ÇalışanNo 269), raporlarıSariyave pazarlama yardımcı ebru (ÇalışanNo 272), raporlarıGamze.

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

  1. Aşağıdaki örnek ekler David pazarlama yöneticisi içine tablo sıradüzenin kökünde.The OrdLevel column is a hesaplanan sütun.Bu nedenle, bu INSERT ifadesinin bir parçası değil.Bu ilk kaydı kullanır GetRoot() yöntem bu ilk kaydının sıradüzenin kökü olarak doldurmak için.

    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)
    VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ;
    GO
    
  2. Ilk satırda incelemek için şu kodu yürütmesine tablo:

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

    Here is the result set.

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

Kullanıyoruz önceki derste olarak, ToString() dönüştürme yöntem hierarchyid verileri daha kolay anlaşılır bir biçimde yazın.

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

  1. Sariya için bildiriyor.David.Eklemek için Sariya'ler düğüm uygun bir oluşturmalısınız.OrgNode veri değeri yazınhierarchyid. Aşağıdaki kod bir değişken veri türü oluşturur. hierarchyid ve bu tablonun OrgNode değeri kök ile doldurur. Then uses that variable with the GetDescendant() method to insert row that is a subordinate node.GetDescendant takes two arguments.Bağımsız değişken değeri için aşağıdaki seçenekleri gözden geçirin:

    • Üst, NULL ise GetDescendant NULL döndürüyor.

    • Üst BOş olmayan ve NULL, child1 hem alt2 GetDescendant üst alt döndürür.

    • Üst ve child1 BOş olmayan ve NULL, alt2 varsa GetDescendant üst alt child1 büyük verir.

    • Üst ve alt2 BOş olmayan ve NULL, child1 GetDescendant üst alt alt2'dan küçük döndürür.

    • Üst ve child1 alt2 tüm ise NULL. GetDescendant üst alt child1 daha büyüktür ve küçüktür alt2'ı verir.

    Aşağıdaki kullandığı kod (NULL, NULL) olduğu için değil tüm satırlar ancak kök bağımsız değişkenleri üst tablo kök hariç. yürütmek eklemek için aşağıdaki kodu 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. Sorgudan tablo sorgulamak ve girişleri görüntülenme Bkz: ilk yordamı yineleyin:

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

    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
    

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

  1. Girme veri basitleştirmek için aşağıdakileri oluşturmak için çalışanları eklemek için saklı yordamıyla EmployeeOrg tablo.Yordamı eklenen çalışan hakkındaki giriş değerleri kabul eder.Bu ÇalışanNo Yeni bir çalışanın yöneticisinin, yeni bir çalışanın ÇalışanNo numarası ve adı ve başlık.Yordamı kullanır. GetDescendant() ve ayrıca GetAncestor() yöntem.Yordamı oluşturmak için şu kodu çalıştırı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
    
  2. Aşağıdaki örnek, doğrudan veya dolaylı olarak rapor 4 çalışanları Kalan 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' ;
    
  3. Yine, aşağıdaki sorgu yürütmek satırları inceleyin EmployeeOrg tablo:

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

    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
    

Tabloyu şimdi tam olarak Pazarlama kuruluş ile doldurulur.