声明终止。在语句完成之前,最大递归100已用尽

时间:2012-02-13 09:26:42

标签: sql xml sql-server-2005

我正在编写一个存储过程来检索菜单控件的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相关的位置。我得到的其他一些疑问在

之下
  1. CTE用于菜单是否完美无缺。你有什么其他类型的成功
  2. 为此目的,
  3. DataSetChildRelations也很好(或者我错了)?
  4. 给我更多关于如何在项目中完成菜单系统的想法。

    输入

    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结构。我首先没有让查询运行。

2 个答案:

答案 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)

检索数据并在应用层上进行构建工作会不会更容易?

修改

一般情况下,我不会建议使用缓存方法,但是,如果菜单生成代码很昂贵,并且假设菜单变化不大,那么这将是缓存的良好目标。