Verileri Hiyerarşik yöntemleri kullanarak hiyerarşik bir tablo içinde yeniden sıralama
Bir hiyerarşi yeniden düzenleyerek, ortak bir bakım iştir. Bu görev, biz bir update deyimi ile kullanacağınız GetReparentedValue önce tek bir satır hiyerarşisinde yeni bir konuma taşımak için yöntem. Sonra biz bütün bir alt ağacı yeni bir konuma taşır.
GetReparentedValueYöntemi, iki bağımsız değişken alır. İlk bağımsız değişken olarak hiyerarşisinin parçası açıklar. Örneğin, bir hiyerarşi, /1/4/2/3/ ve değiştirmek istediğiniz /1/4/ bölümünde, hiyerarşi olur /2/1/2/3/, son iki düğümden bırakarak (2/3/) değişmeden, değişen düğümleri sağlamanız gerekir (/1/4/) ilk argüman olarak. İkinci argüman bizim örnekte yeni hiyerarşi düzeyi sağlar /2/1/. İki bağımsız düzeyleri aynı sayıda içermesi gerekmez.
Tek bir satır hiyerarşisinde yeni bir konuma taşımak için
Şu anda Wanida Sariya için raporlar. Bu yordamda, onu geçerli düğümden Wanida taşımak /1/1/ böylece o Jill için raporlar. Ona yeni bir düğüm haline /3/1/ çok /1 / ilk bağımsız değişken ve /3/ ikinci. Bunlar karşılık = OrgNode Sariya ve Jill değerleri. Wanida Sariya'nın kuruluşu için jill'nin taşımak için aşağıdaki kod yürütün:
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 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
Sonucu görmek için aşağıdaki kod yürütün:
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
Wanida şu anda bir düğüm /3/1/.
Hiyerarşik bir bölümünü yeniden düzenlemek için
Çok sayıda kişi aynı anda taşımak nasıl göstermek için ilk Wanida için raporlama stajyer eklemek için aşağıdaki kodu yürütün:
EXEC AddEmp 269, 291, 'Kevin', 'Marketing Intern' ; GO EXEC AddEmp 269, 291, 'Kevin', 'Marketing Intern' ; GO
Şimdi kim Jill kim David raporlar, raporları Wanida Kevin bildirir. Kevin düzeyinde olduğu anlamına /3/1/1/. Jill astları tüm yeni bir Yöneticisi taşımak için olan tüm düğümler güncellenir /3/ olarak kendi = OrgNode için yeni bir değer. Wanida Sariya için rapor, ama Wanida için raporlama Kevin'ı almak için güncelleştirmek için aşağıdaki kod yürütün:
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; 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;
Sonucu görmek için aşağıdaki kod yürütün:
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
/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
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
Jill (Wanida ve Kevin) şimdi Sariya raporları rapor vardı tüm kuruluş ağaç.
Bir saklı yordam bir hiyerarşi bir bölümünü yeniden düzenlemek, bkz: "hareketli ağaçların" bölümünde Working with hierarchyid Data.