Заявление прекращено. Максимальная рекурсия 100 была исчерпана до завершения оператора - PullRequest
3 голосов
/ 13 февраля 2012

Я пишу хранимую процедуру для получения структуры 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. DataSet и ChildRelations тоже хороши (или, может быть, я ошибаюсь) для этой цели?

Дайте мне больше идей о том, как вы достигли системы меню в ваших проектах.

Input

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>

Не обращайте внимания на структуру xml, которую легко получить с помощью FOR XML PATH Во-первых, я не запускаю запрос.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Держу пари, что

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 голос
/ 13 февраля 2012

Не проще ли получить плоские данные и выполнить строительные работы на уровне приложения?

EDIT:

В общем, я бы не рекомендовал подход к кешированию, но если бы код генерации меню был дорогим и предполагал, что меню не сильно меняются, это было бы хорошей целью для кеширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...