我正在编写一个存储过程来检索菜单控件的xml结构。这似乎是一个有效的代码(根据我和它是错误的)但在查询测试器上运行不佳。我怎么能纠正下面的错误是代码
;WITH Hierarchy AS
(
SELECT
MenUid,MenuName,ApplicationId,ParentMenuId, 1 AS 'Level'
FROM
dbo.Menu
WHERE
ParentMenuId = '-1'
UNION ALL
SELECT
M.MenUid,M.MenuName,M.ApplicationId,M.ParentMenuId, Level + 1 AS 'Level'
FROM
dbo.Menu M
INNER JOIN
Hierarchy h ON M.ParentMenuId = h.MenuId
)
SELECT *
FROM Hierarchy
ORDER BY [Level],[MenuName]
ParentMenuId和MenuId相关的位置。我得到的其他一些疑问在
之下CTE
用于菜单是否完美无缺。你有什么其他类型的成功DataSet
和ChildRelations
也很好(或者我错了)?给我更多关于如何在项目中完成菜单系统的想法。
MenuId MenuName ApplicationId ParentMenuId
1 MenuName1 1 -1
2 MenuName2 1 1
3 MenuName3 1 -1
4 MenuName4 1 2
<Output>
<Menu>
<MenuId>1</MenuId>
<MenuName>MenuName1</MenuName>
<ApplicationId>1</ApplicationId>
<ParentMenuId>-1</ParentMenuId>
<SubMenu>
<Menu>
<MenuId>2</MenuId>
<MenuName>MenuName2</MenuName>
<ApplicationId>1</ApplicationId>
<ParentMenuId>1</ParentMenuId>
<SubMenu>
<MenuId>3</MenuId>
<MenuName>MenuName4</MenuName>
<ApplicationId>1</ApplicationId>
<ParentMenuId>3</ParentMenuId>
</SubMenu>
</Menu>
</SubMenu>
</Menu>
<Menu>
<MenuId>4</MenuId>
<MenuName>MenuName3</MenuName>
<ApplicationId>1</ApplicationId>
<ParentMenuId>-1</ParentMenuId>
</Menu>
</Output>
我不介意使用FOR XML PATH
轻松获取xml结构。我首先没有让查询运行。
答案 0 :(得分:5)
我打赌那个
INNER JOIN
Hierarchy h ON M.ParentMenuId = h.ParentMenuId
实际上应该是
INNER JOIN
Hierarchy h ON M.ParentMenuId = h.MenuId
编辑
使用此样本数据:
declare @Menu table (
MenuId int,
MenuName nvarchar(20),
ApplicationId int,
ParentMenuId int
)
insert @Menu values
(1, 'Name1', 1, -1),
(2, 'Name2', 1, 1),
(3, 'Name3', 1, -1),
(4, 'Name4', 1, 2)
和您的查询,通过上述修改,我得到了
MenUid MenuName ApplicationId ParentMenuId Level
----------- -------------------- ------------- ------------ -----------
1 Name1 1 -1 1
3 Name3 1 -1 1
2 Name2 1 1 2
4 Name4 1 2 3
看起来是正确的。为了帮助您,我们需要查看所有您的相关代码。
答案 1 :(得分:1)
检索数据并在应用层上进行构建工作会不会更容易?
修改
一般情况下,我不会建议使用缓存方法,但是,如果菜单生成代码很昂贵,并且假设菜单变化不大,那么这将是缓存的良好目标。