2010-12-14 19 views
8

BuYaratma

/gibi HierarchyID eklemek istiyorum HierarchyID - CEO (Root)

/1/- Satın Alma Müdürü /2/- Satış Müdürü

/1/1/- Satınalma Yöneticisi /2/1/- Satış Yöneticisi

Hiyerarşiyi kullanmak istediğim şey budur, doğru mu, eğer öyleyse bunu nasıl yapabilirim, herhangi biri bana kod snippet'i verebilir.

+0

Bu URL'leri denetleyin: [Hiyerarşi Veri Türlerini Kullanma (Veritabanı Altyapısı)] (http://technet.microsoft.com/en-us/library/bb677173.aspx) [Eğitmen: Hiyerarşid Veri Türünü Kullanma] (http: //technet.microsoft.com/en-us/library/bb677213.aspx) –

cevap

17

hierarchyid veri türü ile ilgili bilgi ararken bu soruya rastladım ve soru başına hierarchyid kodunu eklemek için kodun da göründüğünden sonra gelen herkes için ilginç olacağını düşündüm.

Bunların, hierarchyid s eklemek için tek yol olduğunu iddia etmiyorum, ancak umarım, bu tür bir veriyle çalışan önceki deneyimim olmayanlar gibi yardımcı olur. Bu tabloyu kullanarak

,

create table OrgChart 
(
    Position hierarchyid, 
    Title nvarchar(50) 
) 

doğrudan dize yolları kullanarak hierarchyid s eklemek için Parse kullanabilirsiniz: masayı

select Position.ToString(), * from OrgChart 
kontrol etmek

insert into OrgChart(Position, Title) 
    values (hierarchyid::Parse('/'), 'CEO'), 
      (hierarchyid::Parse('/1/'), 'Purchase Manager'), 
      (hierarchyid::Parse('/1/1/'), 'Purchase Executive'), 
      (hierarchyid::Parse('/2/'), 'Sales Manager'), 
      (hierarchyid::Parse('/2/1/'), 'Sales Executive') 

ve aşağıdaki sorguyu kullanın

Ayrıca'yi de kullanabilirsiniz. Hiyerarşiyi oluşturmak içinveri türü yöntemleri GetRoot ve GetDescendant. Bu yöntemi daha hantal olmak için buldum, ancak hiyerarşiyi programlı olarak yönetiyorsanız, bu yöntemleri kullanmak gerektiğini varsayalım.

declare @root hierarchyid, 
     @id hierarchyid 

set @root = hierarchyid::GetRoot() 

insert into OrgChart(Position, Title) values (@root, 'CEO') 

set @id = @root.GetDescendant(null, null) 
insert into OrgChart(Position, Title) values (@id, 'Purchase Manager') 

set @id = @root.GetDescendant(@id, null) 
insert into OrgChart(Position, Title) values (@id, 'Sales Manager') 

select @id = Position.GetDescendant(null, null) from OrgChart where Title = 'Purchase Manager'  
insert into OrgChart(Position, Title) values (@id, 'Purchase Executive') 

select @id = Position.GetDescendant(null, null) from OrgChart where Title = 'Sales Manager'  
insert into OrgChart(Position, Title) values (@id, 'Sales Executive') 

Kesinlikle diğer yanıtında sağlanan bağlantıları kontrol, ama umarım hem yardımcı olacaktır denemek için bu kodu olan.

+0

Güzel yanıt. Basit tuttuğun için teşekkürler.İlk INSERT kodu @adrift – Phil

+0

elden önce hiyerarşi yolunu biliyor ve bu nedenle bir realworld senaryoda çok sürdürülebilir değil varsayar. Bunun için hiyerarşid yöntemlerini (hantal olarak etiketlediklerinizi) kullanmanız gerekir. Zaten İd-parentId sütunları olduğunda –

0

Kendiniz birleştirme (aşağıda gösterildiği gibi) içeren bir tablo şemanız olduğunu ve CEO'nızın Yönetici kimliğinin NULL olduğunu varsayın.

CREATE TABLE Employees 
(
    EmployeeID int NOT NULL IDENTITY(1,1) PRIMARY KEY 
    , JobTitle nvarchar(50) NOT NULL 
    , FirstName nvarchar(50) NOT NULL 
    , LastName nvarchar(50) 
    , ManagerID int 
) 

ALTER TABLE dbo.Employee ADD CONSTRAINT FK_Employee_ManagingEmployee FOREIGN KEY (MangerID) REFERENCES dbo.Employee (EmployeeID) ON 

UPDATE NO ACTION 
    ON 

DELETE NO ACTION 

Aşağıdaki özyinelemeli CTE kullanarak hierarchyid değerler bir başlangıç ​​seti otomatik oluşturabilir: Daha sonra olur

;WITH EmployeeHierarchy (
    EmployeeHierarchyID 
    , EmployeeID 
    , JobTitle 
    , LastName 
    , FirstName 
    , ManagerID 
    ) 
AS (
    SELECT HIERARCHYID::GetRoot() AS EmployeeHierarchyID 
     , EmployeeID 
     , JobTitle 
     , LastName 
     , FirstName 
     , ManagerID 
    FROM Employee 
    WHERE ManagerID IS NULL 

    UNION ALL 

    SELECT HIERARCHYID::Parse(EmployeeHierarchyID.ToString() + (
       CONVERT(VARCHAR(20), ROW_NUMBER() OVER (
         ORDER BY EmployeeHierarchy.EmployeeID 
         )) 
       ) + '/') AS EmployeeHierarchy 
     , EmployeeHierarchy.EmployeeID 
     , EmployeeHierarchy.JobTitle 
     , EmployeeHierarchy.LastName 
     , EmployeeHierarchy.FirstName 
     , EmployeeHierarchy.ManagerID 
    FROM Employee 
    INNER JOIN EmployeeHierarchy AS d 
     ON Employee.ManagerID = d.EmployeeID 
    ) 
SELECT TOP (100) PERCENT EmployeeHierarchyID 
    , EmployeeID 
    , JobTitle 
    , LastName 
    , FirstName 
    , ManagerID 
INTO #EmployeeHierarchy 
FROM EmployeeHierarchy 
ORDER BY EmployeeHierarchyID 

oldukça önemsiz bir konu bir dizin eklemek, tabloya bir Hierarchyid sütun eklemek için Bunun üzerine, geçici masaya katılarak doldurun. Eğer ekledikten sonra Hierarchyid verilerin tutarlı kalmasını istiyorsanız

UPDATE Employee 
SET   EmployeeHierarchyID = #EmployeeHierarchy.EmployeeHierarchyID 
FROM  Employee INNER JOIN 
        #EmployeeHierachy ON Employee.EmployeeID = #EmployeeHierarchy.EmployeeID 

Ancak unutmayın ki, bu sağlanmalıdır hangi çok özel yolları olduğunu.

+0

İşte https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-and-HierarchyId Hid nesil için bir daha örneğidir –

İlgili konular