HierarchyID如何从子级获取所有父级

Man*_*uel 6 hierarchyid

我对菜单的hierarchyID和UserRights有问题.我只想给用户4级权限,我的QUery应该自动从4级孩子中选择所有父级.这该怎么做 ?

你了解我的问题吗?我只想要一个孩子的所有父母(祖先).

迎接曼努埃尔

Ode*_*Tal 1

假设您有这张表:

CREATE TABLE Hierarchy
(
    CompanyNode hierarchyid NOT NULL,
    CompanyId int NOT NULL,
    NodeLevel AS CompanyNode.GetLevel()
    CONSTRAINT PK_Hierarchy PRIMARY KEY NONCLUSTERED (CompanyNode)
)
Run Code Online (Sandbox Code Playgroud)

然后填充它,使其保存以下数据:

CompanyNode CompanyId NodeLevel
0x  1   0
0x58    2   1
0x5AC0  3   2
0x68    100 1
0x6AC0  101 2
0x6AD6  1000    3
0x6AD6B0    10000   4
0x78    20  1
0x7AC0  200 2
0x7AD6  2000    3
0x7AD6B0    20000   4
0x7AD6B580  200000  5
0x7AD6D0    20001   4
0x7ADA  2001    3
0x7ADE  2002    3
0x7B40  201 2
0x7BC0  202 2
Run Code Online (Sandbox Code Playgroud)

现在你想要获取 CompanyId 20001 的所有父项,我就是这样做的:

DECLARE @currentLevel smallint

SELECT  @currentLevel = NodeLevel
FROM    Hierarchy
WHERE   CompanyId = 20001;

with tree([Path], [PathName], CompanyId, [Level])
AS
(
SELECT  h.CompanyNode AS [Path],
        h.CompanyNode.ToString() AS [PathName],
        h.CompanyId,
        @currentLevel AS [Level]
FROM    Hierarchy h
WHERE   h.CompanyId = 20001

UNION ALL

SELECT  h.CompanyNode AS [Path],
        h.CompanyNode.ToString() AS [PathName],
        h.CompanyId,
        CAST((t.[Level] - 1) AS smallint) AS [Level]
FROM    Hierarchy h
        INNER JOIN tree t ON
            t.[Path].GetAncestor(1) = h.CompanyNode
    WHERE   h.[NodeLevel] > 0
)   
SELECT * FROM TREE
order by [Path]
Run Code Online (Sandbox Code Playgroud)

您可以更改 CTE 的递归部分,而不过滤树的最顶层节点。

希望这可以帮助,

奥德