В настоящее время мы хранимая процедура, которая возвращает данные из таблицы в оригинальную схеме, сделать что-то вроде этого:Как ограничить глубину рекурсии CTE, но выберите общую таблицу?
WITH CTE AS
(
-- Start CTE off by selecting the id that was provided to stored procedure.
SELECT *
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of records already found in previous iterations.
UNION ALL
SELECT t.*
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
)
SELECT *
FROM CTE
Это хорошо, потому что независимо от того, как изменения схемы таблиц, до тех пор, как есть [ Id] и [ParentId], мне не нужно будет обновлять эту хранимую процедуру. Я хотел бы сделать что-то подобное, но также иметь возможность динамически определять глубину рекурсии. Единственный способ, которым я видел, чтобы сделать это, чтобы добавить уровень/идентификатор глубины примерно так:
WITH CTE AS
(
-- Start CTE off by selecting the task that was provided to stored procedure.
SELECT *, 0 as [Level]
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
UNION ALL
SELECT t.*, [Level] + 1
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
WHERE [Level] < 2
)
SELECT *
FROM CTE
Это хорошо работает, но забирает главный плюс предыдущего запроса с момента выбора *
в конце даст я тоже уровень. Есть ли другой способ сделать это, когда я могу указать уровень, но также в целом выбрать все столбцы из таблицы? Заранее спасибо.
Похоже, что ошибка возникает, когда предел достигнут. Есть ли способ остановить его на основе MAXRECURSION, но продолжать использовать результаты? – Ocelot20
Ответил выше (с другим предложением) ... – mwigdahl