5
目前我们已经从一个表中返回数据的存储过程,通过做这样的事情的原始架构:如何限制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 2012-01-16 19:45:33
回答上面(有另一个建议)... – mwigdahl 2012-01-16 19:55:54