在SQL SERVER 2008中引入了一个新的类型,为hierarchyid,支持层次结构,hierarchyid从技术上讲是一个CLR UDT,但是在SQL SERVER 2008不必先启用它。

考虑下面的层次结构

SQL SERVER 2008的层次结构支持_sql语句

可以用如下SQL语句表示

CREATE TABLE Employees 
(node hierarchyid PRIMARY KEY CLUSTERED,
 level as node.GetLevel() PERSISTED,
 employee_id INT UNIQUE,
 employee_name varchar(30) NOT NULL)
 
 
insert into Employees Values(hierarchyid::GetRoot(),5000,'Rob') 

declare @ManagerNode hierarchyid
declare @Level hierarchyid

select @ManagerNode=node FROM Employees WHERE employee_id=5000
insert into Employees Values(@ManagerNode.GetDescendant(NULL,NULL),5001,'Bill')

select @Level=node from Employees where employee_id=5001
insert into Employees values(@ManagerNode.GetDescendant(@Level,NULL),5002,'Steve')

select node.ToString() as NodeAsString,node as NodeAsBinary,
  node.GetLevel() As Level,employee_id,employee_name from Employees
  
declare @Level hierarchyid  
select @Level=node from Employees where employee_id=5002
insert into Employees values(@Level.GetDescendant(NULL,NULL),5003,'Jim')  

declare @child1 hierarchyid
select @child1=node from Employees where employee_id=5003
insert into Employees values(@Level.GetDescendant(@child1,NULL),5004,'Steve')

select @Level=node from Employees where employee_id=5001
insert into Employees values(@Level.GetDescendant(NULL,NULL),5005,'Joseph')


select @child1=node from Employees where employee_id=5005
insert into Employees values(@Level.GetDescendant(@child1,NULL),5006,'Joan')


select @Level=node from Employees where employee_id=5006
insert into Employees values(@Level.GetDescendant(NULL,NULL),5007,'Alice')

select @child1=node from Employees where employee_id=5007
insert into Employees values(@Level.GetDescendant(@child1,NULL),5008,'Barbara')

select node.ToString() as NodeAsString,node as NodeAsBinary,
  node.GetLevel() As Level,employee_id,employee_name from Employees