我对菜单的hierarchyID和UserRights有问题.我只想给用户4级权限,我的QUery应该自动从4级孩子中选择所有父级.这该怎么做 ?
你了解我的问题吗?我只想要一个孩子的所有父母(祖先).
迎接曼努埃尔
假设您有这张表:
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 的递归部分,而不过滤树的最顶层节点。
希望这可以帮助,
奥德
| 归档时间: |
|
| 查看次数: |
8714 次 |
| 最近记录: |