Hiyerarşik Veri Tipi (Hierarchical Datatype)
Bu veri tipini daha çok organizasyon şeması, dosya/klasör listelerinde, ürün kataloglarında, forumlarda kullanabilirsiniz. Hiyerarşik veri, veri parçası setlerinin birbirleri arasındaki farklı bağlarını tanımlar. Basit bir şekilde tanımlamak gerekirse, ana-alt öğe bağlantısı birer hiyerarşi formudur. Ana öğenin, alt öğeleri olduğu gibi, hiç öğesi de olmayabilir. Alt öğelerinde kendi altlarında öğe gruplarının olması mümkündür.
hierarchyid veri tipi, uygulamalarınızın çok miktarda hiyerarşik veriyi paylaşması için önemlidir. İlişkili operasyonlarınızı hiyerarşik veri ile yapmanıza olanak sağlar. hierarchyid veri tipi, DATE/TIME gibi tek başına veri tipi değildir. Daha doğrusu sistem tarafından tanımlanan UDT dir. Bu yeni veri tipiMicrosoft.SqlServer.Types.dll altında konumlanmıştır ve Microsoft.SqlServer.Types namespace i tarafından oluşturulur. Veriler hiyerarşik düzende aşağıdaki gibi konumlandırılmış olur.

Bu şekilde bir yapıyı oluşturabilmemiz için bilmemiz gereken 4 adet fonksiyon vardır. Bunları tek tek açıklayalım.
ToString(): Bu fonksiyon azda olsa görselliğe hitap eder. Hiyerarşiyi "/" işaretleri ile gösterir.
GetRoot(): Slash işaretleri arası Node ID yapımızı belirler.
GetDescendant(): Node öğemizin altında başka bir öğe olup olmadığını saptarız.
GetAncestor(): Alt öğeden üst öğelere doğru adım atmamızı sağlar.
Bilmemiz gereken fonksiyonlarımızı öğrendikten sonra çizdiğimiz örneğe göre verimizi modellemeye başlayalım. İlk olarak Tablomuzu oluşturuyoruz.
CREATE TABLE [dbo].[OrganizasyonSemasi]
(
[DepHID] HIERARCHYID PRIMARY KEY,
[DepID] INT NOT NULL,
[DepIsmi] VARCHAR(50) NOT NULL,
[DepUye] VARCHAR(50) NOT NULL
)
Tablomuzu oluşturduktan sonra Root Node'u yani hiyerarşik yapımızın en tepesini belirliyoruz.
INSERT INTO OrganizasyonSemasi (DepHID, DepID, DepIsmi, DepUye)
VALUES (hierarchyid::GetRoot(), 1, 'Bilgi Teknolojileri', 'Ahmet')
Root'umuzun nasıl gözüktüğüne bakalım.

Buraya kadar oluşturmak istediğimiz organizasyon şemamızın en üst seviyesini belirledik. hierarchyid mizi verdik, GetRoot() diyerek ID mizi olusturduk ve Departman ID mizin 1'den başlayacağını belirledik. Şimdi ise tek tek Organizasyon şemamızı doldurabiliriz. Bunun için SP kullanmak çok daha kolay olacaktır. SP'mizi oluşturuyoruz.
CREATE PROC InsertDep(@OrgID INT,
@DepID INT,
@DepIsmi VARCHAR(50),
@DepUye VARCHAR(50)) As
BEGIN
DECLARE @OrgHID AS HIERARCHYID
DECLARE @OrgSonKisi AS HIERARCHYID
SELECT @OrgHID = DepHID FROM OrganizasyonSemasi WHERE DepID = @OrgID
SELECT @OrgSonKisi = MAX(DepHID) FROM OrganizasyonSemasi
WHERE DepHID.GetAncestor(1) = @OrgHID
INSERT INTO OrganizasyonSemasi
VALUES (@OrgHID.GetDescendant(@OrgSonKisi, Null),
@DepID, @DepIsmi, @DepUye)
RETURN @@ROWCOUNT
END
Hiyerarşiyi herzaman artan olarak ilerletiyoruz. Root'un OrgID si yok. Bir alt node'a indiğimizde 3 ana departmanın ID'sini 1 veriyoruz. Bundan sonraki kırılımları da aynı şekilde kırılacak node'un ID'si ile devam ettiriyoruz.
EXEC InsertDep 1, 2, 'Yazılım', 'Mehmet'
EXEC InsertDep 1, 3, 'Sistem', 'Kemal'
EXEC InsertDep 1, 4, 'Güvenlik','Cem'
EXEC InsertDep 2, 5, 'Database', 'Veli'
EXEC InsertDep 2, 6, 'CRM', 'Haydar'
EXEC InsertDep 3, 7, 'Altyapı', 'Onur'
EXEC InsertDep 3, 8, 'Masaüstü','Cihan'
EXEC InsertDep 4, 9, 'Web', 'Selim'
EXEC InsertDep 4, 10, 'Router', 'Mert'
Sonuç olarak Hiyerarşik yapımızı aşağıdaki gibi tamamlamış olduk.
