GetDescendant (Mesin Database)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Mengembalikan simpul anak dari induk.

Sintaksis

-- Transact-SQL syntax  
parent.GetDescendant ( child1 , child2 )   
-- CLR syntax  
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 )   

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

child1
NULL atau hierarkiid anak dari simpul saat ini.

child2
NULL atau hierarkiid anak dari simpul saat ini.

Jenis Kembalian

Jenis pengembalian SQL Server:hierarchyid

Tipe pengembalian CLR:SqlHierarchyId

Keterangan

Mengembalikan satu simpul anak yang merupakan turunan dari induk.

  • Jika induk adalah NULL, mengembalikan NULL.
  • Jika induk bukan NULL, dan child1 dan child2 adalah NULL, mengembalikan turunan induk.
  • Jika induk dan turunan1 bukan NULL, dan child2 adalah NULL, mengembalikan turunan induk yang lebih besar dari child1.
  • Jika induk dan turunan2 bukan NULL dan child1 adalah NULL, mengembalikan turunan induk kurang dari child2.
  • Jika induk, turunan1, dan child2 bukan NULL, mengembalikan turunan induk yang lebih besar dari child1 dan kurang dari child2.
  • Jika child1 bukan NULL dan bukan anak dari induk, pengecualian akan dinaikkan.
  • Jika child2 bukan NULL dan bukan anak dari induk, pengecualian akan dinaikkan.
  • Jika child1 >= child2, pengecualian akan dinaikkan.

GetDescendant adalah deterministik. Oleh karena itu, jika GetDescendant dipanggil dengan input yang sama, itu akan selalu menghasilkan output yang sama. Namun, identitas anak yang dihasilkan dapat bervariasi tergantung pada hubungannya dengan simpul lain, seperti yang ditunjukkan dalam contoh C.

Contoh

J. Menyisipkan baris sebagai simpul turunan paling sedikit

Karyawan baru dipekerjakan, melaporkan kepada karyawan yang ada di node /3/1/. Jalankan kode berikut untuk menyisipkan baris baru dengan menggunakan metode GetDescendant tanpa argumen untuk menentukan node baris baru sebagai /3/1/1/:

DECLARE @Manager hierarchyid;   
SET @Manager = CAST('/3/1/' AS hierarchyid);  
  
INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)  
VALUES  
(@Manager.GetDescendant(NULL, NULL),  
'adventure-works\FirstNewEmployee', 'Application Intern', '3/11/07') ;  

B. Menyisipkan baris sebagai simpul turunan yang lebih besar

Karyawan baru lainnya dipekerjakan, melaporkan ke manajer yang sama seperti dalam contoh A. Jalankan kode berikut untuk menyisipkan baris baru dengan menggunakan metode GetDescendant menggunakan argumen anak 1 untuk menentukan bahwa simpul baris baru akan mengikuti simpul dalam contoh A, menjadi /3/1/2/:

DECLARE @Manager hierarchyid, @Child1 hierarchyid;  
  
SET @Manager = CAST('/3/1/' AS hierarchyid);  
SET @Child1 = CAST('/3/1/1/' AS hierarchyid);  
  
INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)  
VALUES  
(@Manager.GetDescendant(@Child1, NULL),  
'adventure-works\SecondNewEmployee', 'Application Intern', '3/11/07') ;  

C. Menyisipkan baris di antara dua simpul yang ada

Karyawan ketiga dipekerjakan, melaporkan ke manajer yang sama seperti dalam contoh A. Contoh ini menyisipkan baris baru ke simpul yang lebih besar dari FirstNewEmployee dalam contoh A, dan kurang dari SecondNewEmployee dalam contoh B. Jalankan kode berikut dengan menggunakan metode GetDescendant. Gunakan argumen child1 dan argumen child2 untuk menentukan bahwa simpul baris baru akan menjadi simpul /3/1/1.1/:

DECLARE @Manager hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid;  
  
SET @Manager = CAST('/3/1/' AS hierarchyid);  
SET @Child1 = CAST('/3/1/1/' AS hierarchyid);  
SET @Child2 = CAST('/3/1/2/' AS hierarchyid);  
  
INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)  
VALUES  
(@Manager.GetDescendant(@Child1, @Child2),  
'adventure-works\ThirdNewEmployee', 'Application Intern', '3/11/07') ;  
  

Setelah menyelesaikan contoh A, B, dan C, simpul yang ditambahkan ke tabel akan menjadi serekan dengan nilai hierarkiid berikut:

/3/1/1/

/3/1/1.1/

/3/1/2/

Node /3/1/1.1/ lebih besar dari node /3/1/1/ tetapi pada tingkat yang sama dalam hierarki.

D. Contoh skalar

SQL Server mendukung penyisipan dan penghapusan arbitrer dari simpul hierarkis apa pun. Dengan menggunakan GetDescendant(), selalu dimungkinkan untuk menghasilkan simpul di antara dua simpul hierarkis. Jalankan kode berikut untuk menghasilkan node sampel menggunakan GetDescendant:

DECLARE @h hierarchyid = hierarchyid::GetRoot();  
DECLARE @c hierarchyid = @h.GetDescendant(NULL, NULL);  
SELECT @c.ToString();  
DECLARE @c2 hierarchyid = @h.GetDescendant(@c, NULL);  
SELECT @c2.ToString();  
SET @c2 = @h.GetDescendant(@c, @c2);  
SELECT @c2.ToString();  
SET @c = @h.GetDescendant(@c, @c2);  
SELECT @c.ToString();  
SET @c2 = @h.GetDescendant(@c, @c2);  
SELECT @c2.ToString();  

E. Contoh CLR

Cuplikan GetDescendant() kode berikut memanggil metode :

SqlHierarchyId parent, child1, child2;  
parent = SqlHierarchyId.GetRoot();  
child1 = parent.GetDescendant(SqlHierarchyId.Null, SqlHierarchyId.Null);  
child2 = parent.GetDescendant(child1, SqlHierarchyId.Null);  
Console.Write(parent.GetDescendant(child1, child2).ToString());  

Baca juga

Referensi Metode Tipe Data hierarkiid
Data Hierarkis (SQL Server)
hierarki (Transact-SQL)