【发布时间】:2014-10-18 06:09:11
【问题描述】:
我在 SQL 中有一个表“ActionItem”,其中包含 ActionItemId、ItemName 和 ParentActionItemId 字段。我正在创建一个存储过程,它将接受 ActionItemId (Id) 并递归显示作为 Id 子项的所有 ActionItem 记录。为此,我使用了 CTE。
ALTER PROCEDURE [dbo].[SSP_ActionItem]
@ActionItemId int
AS
BEGIN
WITH ActionItemList AS
(
-- Anchor
SELECT ActionItem.ActionItemId,
ActionItem.ItemName,
ActionItem.ParentActionItemId
FROM ActionItem
WHERE ActionItemId=@ActionItemId
UNION ALL
-- Recursive query
SELECT AIL.ActionItemId,
AIL.ItemName,
AIL.ParentActionItemId
FROM ActionItem AS AI INNER JOIN ActionItemList AS AIL
ON AI.ParentActionItemId=AIL.ActionItemId
)
SELECT * FROM ActionItemList
--option (maxrecursion 0)
END
表结构:
SELECT TOP 1000 [ActionItemId]
,[ParentActionItemId]
,[ItemName]
FROM [ActionItem]
这个 sp 返回无限记录。我不明白我哪里出错了。谁能帮忙?我是这个 CTE 概念的新手。
【问题讨论】:
-
返回无限记录需要多长时间?
-
如果您可以共享表结构和示例数据可能会有所帮助
-
您的递归部分没有
ActionItem表中的任何列,并且基本上重复了来自锚点的所有信息。它将在设计上是无限的。 @JasonGoemaat:喜欢你的问题:) -
"ON AI.ParentActionItemId=AIL.ActionItemId" 这是递归部分,它有来自 ActionItem 的 ParentActionItemId 列
-
看看递归部分的SELECT列表
标签: sql sql-server recursion common-table-expression