2010-12-14 21 views
8

Tôi muốn chèn HierarchyId nhưTạo HierarchyId

/này - Giám đốc điều hành (Root)

/1/- Mua Manager /2/- Sales Manager

/1/1/- Mua Executive /2/1/- Sales Executive

Đây là thứ mà tôi muốn sử dụng, đúng không, nếu có thì tôi có thể làm điều này.

+0

Kiểm tra các URL sau: [Sử dụng các kiểu dữ liệu phân cấp (Cơ sở dữ liệu) (http://technet.microsoft.com/en-us/library/bb677173.aspx) [Hướng dẫn: Sử dụng kiểu dữ liệu phân cấp] (http: //technet.microsoft.com/en-us/library/bb677213.aspx) –

Trả lời

17

Tôi đã xem qua câu hỏi này trong khi tìm kiếm thông tin trên loại dữ liệu hierarchyid và nghĩ rằng sẽ thú vị nếu có ai khác theo sau tôi xem mã để chèn hierarchyid s theo câu hỏi.

Tôi không tuyên bố rằng đây là những cách duy nhất để chèn hierarchyid giây, nhưng hy vọng nó sẽ giúp những người như tôi không có kinh nghiệm làm việc với loại dữ liệu này.

Sử dụng bảng này,

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

bạn có thể sử dụng Parse để trực tiếp chèn hierarchyid s sử dụng các đường dẫn chuỗi:

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') 

và sử dụng các truy vấn sau đây để kiểm tra bảng

select Position.ToString(), * from OrgChart 

Bạn cũng có thể sử dụng hierarchyid phương thức kiểu dữ liệu GetRootGetDescendant để tạo cấu trúc phân cấp. Tôi thấy phương pháp này cồng kềnh hơn, nhưng tôi cho rằng việc sử dụng các phương pháp này là cần thiết nếu bạn quản lý hệ thống phân cấp theo chương trình.

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') 

Chắc chắn kiểm tra các liên kết được cung cấp trong câu trả lời khác, nhưng hy vọng rằng mã này để thử cũng sẽ giúp ích.

+0

Câu trả lời hay. Cảm ơn bạn đã giữ nó đơn giản. – Phil

+0

@adrift mã INSERT đầu tiên của bạn giả định bạn biết đường dẫn phân cấp trước khi bàn tay và do đó không phải là rất duy trì trong một kịch bản thế giới thực. Bạn sẽ cần phải sử dụng các phương pháp phân cấp (những cái bạn đã gắn nhãn là cồng kềnh) cho điều đó. –

0

Giả sử bạn có lược đồ bảng có tự tham gia (như được hiển thị bên dưới) và ManagerID của CEO của bạn là NULL.

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 

Bạn có thể tự động tạo ra một thiết lập ban đầu của các giá trị HierarchyId sử dụng đệ quy CTE sau:

;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 

Sau đó nó sẽ trở thành một vấn đề khá tầm thường để thêm một cột HierarchyId để bàn, thêm một chỉ số trên đó, và sau đó điền vào nó bằng cách tham gia vào bảng tạm thời.

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

Tuy nhiên, hãy nhớ rằng nếu bạn muốn dữ liệu HierarchyId để vẫn còn phù hợp sau khi bạn thêm nó, có những cách rất cụ thể trong đó nó nên được duy trì.

+0

Đây là một ví dụ nữa cho thế hệ Hid khi bạn đã có các cột Id-ParentId https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-and-HierarchyId –

Các vấn đề liên quan