2010-05-04 43 views
2

如何查询具有数据类型HIERARCHYID列的表并获取员工下深层次X级别列表?SQL 2008 HierarchyID - 选择X后裔下降

这里是目前的结构:

CREATE TABLE [dbo].[Employees](
    [NodeId] [hierarchyid] NOT NULL, 
    [EmployeeId] [int] IDENTITY(1,1) NOT NULL, 
    [FirstName] [varchar](120) NULL, 
    [MiddleInitial] [varchar](1) NULL, 
    [LastName] [varchar](120) NULL, 
    [DepartmentId] [int] NULL, 
    [Title] [varchar](120) NULL, 
    [PhoneNumber] [varchar](20) NULL, 
    [IM] [varchar](120) NULL, 
    [Photo] [varbinary](max) NULL, 
    [Bio] [varchar](400) NULL, 
    [Active] [bit] NULL, 
    [ManagerId] [int] NULL 
) 
+0

可能的重复http://stackoverflow.com/questions/2659721/how-to-find-all-descendants-using-hierarchyid-for-sql-server – IEnumerator 2010-05-04 20:19:42

回答

3

我想一点点添加到上面。除了选择树的一个分支之外,你通常只需要一定深度的后代。为了达到这个目的,许多表格使用“深度”添加额外的计算列(类似[Depth] AS (myHierarchy.GetLevel]())。有了这个额外的列,您可以运行类似以下的查询来限制深度。

SELECT @MaxDepth  = 3, 

SELECT @theParent  = Hierarchy, 
     @theParentDepth = Depth 
FROM myTreeTable T 
WHERE T.RowID   = @RowID 

SELECT myHierarchy 
FROM  myTreeTable T 
WHERE  T.myHierarchy.IsDescendantOf(@theParent) = 1 AND 
      T.Depth < (@theParentDepth + @MaxDepth) 

注意,你如果你是严重依赖于它要编制索引的计算列(可能进行组合或者包括其他一些列)。