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
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
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
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') ;
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
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
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' ;
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