Populating a Hierarchical Table Using Hierarchical Methods
AdventureWorks ma 8 pracowników w dziale marketingu.Hierarchia pracownika wygląda następująco:
David, Pole IDPracownika 6, jest Menedżer marketingu.Trzy Specialists Marketing raportu David:
Sariya, Pole IDPracownika 46
Jan, Pole IDPracownika 271
Jill, Pole IDPracownika 119
Asystent obrotu Wanida (Pole IDPracownika 269), raportySariyai Asystent Marketing Anna (Pole IDPracownika 272), raportyJan.
Aby wstawić katalog główny drzewa hierarchii
W poniższym przykładzie wstawia David menedżera marketingu do tabela w katalogu głównym w hierarchii.The OrdLevel column is a kolumna obliczana.Dlatego nie jest częścią instrukcja INSERT.To pierwszy rekord jest umieszczany w GetRoot() metoda wypełnić to pierwszy rekord w hierarchii znajduje się katalog główny.
INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title) VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ; GO
Wykonaj następujący kod w celu zbadania początkowych wierszy w tabela:
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
Podobnie jak w poprzedniej lekcji używamy ToString() Metoda konwersji hierarchyid Typ danych do formatu, który jest łatwo zrozumiały.
Aby wstawić podrzędny pracownika
Sariya zgłasza David.Aby wstawić Sariya firmy , węzeł, należy utworzyć odpowiednie OrgNode wartości danych, należy wpisaćhierarchyid. Następujący kod tworzy zmienną typu danych hierarchyid i wypełnia ją z głównym OrgNode wartości w tabela. Then uses that variable with the GetDescendant() method to insert row that is a subordinate node.GetDescendant takes two arguments.Przejrzyj następujące opcje dla wartości argumentu:
Jeśli nadrzędny ma wartość NULL, GetDescendant Zwraca wartość NULL.
Jeśli element nadrzędny nie jest NULL, a child1 i child2 są wartości NULL, GetDescendant Zwraca element podrzędność obiektu nadrzędnego.
Jeśli nadrzędny i child1 nie jest NULL, a child2 ma wartość NULL, GetDescendant Zwraca wartość większą niż child1 element podrzędność obiektu nadrzędnego.
Jeśli nadrzędny i child2 nie są wartości NULL i child1 ma wartość NULL, GetDescendant mniej niż child2 zwraca element podrzędność obiektu nadrzędnego.
W przypadku obiektu nadrzędnego, child1 i child2 wszystkie nie jest NULL, GetDescendant Zwraca element podrzędność obiektu nadrzędnego, większa child1 i mniejsza niż child2.
Następujący kod używa (NULL, NULL) argumenty głównego po obiekcie nadrzędnym, ponieważ nie ma jeszcze żadnych wierszy w tabela, z wyjątkiem katalogu głównego. wykonać następujący kod do wstawienia 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') ;
Powtórz kwerendy z pierwszej procedury wyszukiwania w tabela i sprawdzić, w jaki sposób są wyświetlane wpisy:
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
Aby utworzyć procedury umożliwiające wprowadzanie nowych węzłów
Aby uprościć wprowadzanie danych, utwórz następujące przechowywane procedury, aby dodać pracownika do EmployeeOrg tabela.Procedura akceptuje wartości wejściowych informacje o dodawaniu pracownika.Obejmuje to Pole IDPracownika nowego pracownika kierownika, nowy pracownik Pole IDPracownika numer oraz ich imienia i tytuł.Procedura wykorzystuje GetDescendant() a także GetAncestor() metoda.wykonać następujący kod do procedury tworzenia:
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
W następującym przykładzie dodano pozostałych 4 pracowników, którzy podlegają bezpośrednio lub pośrednio 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' ;
Ponownie, wykonaj następującą kwerendę Sprawdź w wierszach EmployeeOrg tabela:
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
W tabela teraz zostanie całkowicie wypełniony z organizacji Marketing.