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

Dee*_*ons 3 xml sql 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]
Run Code Online (Sandbox Code Playgroud)

ParentMenuId和MenuId相关的位置.我得到的其他一些疑问如下

  1. 这是完全可以CTE用于菜单.你有哪些其他类型的成功
  2. DataSet并且ChildRelations也很好(也许我错了)为了这个目的?

给我更多关于如何在项目中完成菜单系统的想法.

输入

MenuId      MenuName      ApplicationId    ParentMenuId

 1          MenuName1           1              -1

 2          MenuName2           1               1

 3          MenuName3           1               -1

 4          MenuName4           1               2
Run Code Online (Sandbox Code Playgroud)

产量

<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>
Run Code Online (Sandbox Code Playgroud)

不介意我很容易得到的xml结构我FOR XML PATH没有让查询首先运行.

Aak*_*shM 5

我打赌那个

INNER JOIN
    Hierarchy h ON M.ParentMenuId = h.ParentMenuId
Run Code Online (Sandbox Code Playgroud)

事实上应该是

INNER JOIN
    Hierarchy h ON M.ParentMenuId = h.MenuId
Run Code Online (Sandbox Code Playgroud)

编辑

使用此示例数据:

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)
Run Code Online (Sandbox Code Playgroud)

和你的查询,通过上面的修改,我得到了

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
Run Code Online (Sandbox Code Playgroud)

看起来很正确.为了帮助您,我们需要查看您的所有相关代码.