2010-12-14 8 views
8

Ich mag die hierarchyid wie diesesGene hierarchyid

/einfügen - CEO (Root)

/1/- Kauf-Manager /2/- Sales Manager

/1/1/- Kauf Executive /2/1/- Sales Executive

Das ist, was die Hierarchie ich gerne verwenden würde, ist es richtig, wenn ja, wie kann ich das tun, kann mir jemand ein Code-Snippet geben.

+0

Schauen Sie sich diese URLs: [Mit hierarchyid Datentypen (Datenbankmodul)] (http://technet.microsoft.com/en-us/library/bb677173.aspx) [Tutorial: Mit dem hierarchyid Datentyp] (http: //technet.microsoft.com/en-us/library/bb677213.aspx) –

Antwort

17

Ich bin bei der Suche nach Informationen über den Datentyp hierarchyid auf diese Frage gestoßen und dachte, es wäre interessant für jeden anderen, der nach mir kommt, auch Code zum Einfügen von hierarchyid s wie in der Frage zu sehen.

Ich behaupte nicht, dass dies die einzigen Möglichkeiten sind, hierarchyid s einzufügen, aber hoffentlich wird es denjenigen helfen, die, wie ich, keine vorherige Erfahrung mit diesem Datentyp haben.

diese Tabelle verwenden,

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

Sie Parse direkt verwenden können, um die hierarchyid s legen Sie die Zeichenfolge Pfade mit:

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

und verwenden Sie die folgende Abfrage, um die Tabelle

select Position.ToString(), * from OrgChart 
zu überprüfen

Sie können auch dieverwendenDatentyp und Methoden GetRootGetDescendant die Hierarchie aufzubauen. Ich fand diese Methode umständlicher, aber ich denke, diese Methoden sind notwendig, wenn Sie die Hierarchie programmatisch verwalten.

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

Auf jeden Fall einen Blick auf die in der anderen Antwort ausgebrachten Links, aber hoffentlich diesen Code hat, wird auch zu versuchen, helfen.

+0

Nizza Antwort. Danke, dass du es einfach gehalten hast. – Phil

+0

@adrift Ihr erster INSERT-Code geht davon aus, dass Sie den Hierarchiepfad vorher kennen und daher in einem Realworld-Szenario nicht sehr wartbar sind. Sie müssten dafür die hierarchyid-Methoden (die Sie als umständlich bezeichnet haben) verwenden. –

0

Angenommen, Sie ein Tabellenschema mit einem Self-Join haben (siehe unten), und dass die ManagerID Ihres CEO ist 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 

Sie können einen Anfangssatz von hierarchyid Werte mit dem folgenden rekursiven CTE automatisch generieren:

;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 

Es dann eine ziemlich triviale Angelegenheit wird eine hierarchyid Spalte der Tabelle hinzuzufügen, einen Index hinzufügen darauf und füllen Sie es dann, indem Sie sich an die temporäre Tabelle anschließen.

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

jedoch zu beachten, dass, wenn Sie die hierarchyid Daten konsistent bleiben wollen, nachdem Sie es hinzufügen, gibt es sehr spezifische Weise, in der sie beibehalten werden sollte.

+0

Hier ist ein weiteres Beispiel für die Hid-Generierung, wenn Sie bereits Id-ParentId Spalten https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-HierarchyId haben –