我已经创建了一个非常小的CTE递归函数,但似乎它一直是递归的并且失败了。 请在内容中找到详细信息:
表名称&数据:
insert into dbo.HierarchyEmployee
Values
(1,1, 'Name1'),
(2,1, 'Name2'),
(3,4, 'Name3'),
(4,5, 'Name4'),
(5,2, 'Name5'),
(6,4, 'Name6'),
(7,1, 'Name7'),
(8,8, 'Name8'),
(9,3, 'Name9'),
(10,1, 'Name10')
理想的结果集:
HierarchyParent HierarchyID Name
1 1 Name
1 2 Name2
1 7 Name7
1 10 Name10
我试图通过隐居的CTE实现这一点,因为我想了解递归是如何工作的。
以下是使用的查询:
WITH CTE_HierarchyEmployee
AS
(
SELECT H.HierarchyID,
H.HierarchyParent,
H.Name
FROM dbo.HierarchyEmployee H
WHERE H.HierarchyID = 1
UNION ALL
SELECT H.HierarchyID,
H.HierarchyParent,
H.Name
FROM
dbo.HierarchyEmployee H
INNER JOIN CTE_HierarchyEmployee CTEH
ON H.HierarchyParent = cteh.HierarchyID
)
SELECT * FROM CTE_HierarchyEmployee
错误:
Msg 530,Level 16,State 1,Line 41
声明终止。在语句完成之前,最大递归100已经用尽。
感谢您输入如何解决反感。
答案 0 :(得分:1)
编辑:我找出原因。问题出在样本数据中。最HierarchyID = 1的父亲也有ParentId = 1.在" NORMAL"在情况不是这样的情况下,大多数时候最顶层id的parentID是NULL。由于父级和HierarchyID相同(1),因此进入1的循环是1的父级。 有两种方法可以解决问题: 1.将HierarchyID = 1的parentID更新为NULL 2.在递归查询中添加额外的条件,其中H.HierarchyID<> 1
您只需在查询结束时添加OPTION(MAXRECURSION 0)即可超过100次递归的限制。参见:
WITH CTE_HierarchyEmployee
AS
(
SELECT H.HierarchyID,
H.HierarchyParent,
H.Name
FROM dbo.HierarchyEmployee H
WHERE H.HierarchyID = 1
UNION ALL
SELECT H.HierarchyID,
H.HierarchyParent,
H.Name
FROM
dbo.HierarchyEmployee H
INNER JOIN CTE_HierarchyEmployee CTEH
ON H.HierarchyParent = cteh.HierarchyID
)
SELECT * FROM CTE_HierarchyEmployee
OPTION (MAXRECURSION 0)