最大递归 100 在语句完成之前已经用完
Posted
技术标签:
【中文标题】最大递归 100 在语句完成之前已经用完【英文标题】:The maximum recursion 100 has been exhausted before statement completion 【发布时间】:2012-03-27 20:20:37 【问题描述】:我不断收到 max recursion error
与此查询。
起初我以为是因为返回了一个空值,然后它会尝试匹配导致错误的空值,但是我重写了我的查询,因此不返回空值并且错误仍然发生。
重写这个函数最好的方法是什么,这样就不会发生错误
WITH EmployeeTree AS
(
SELECT
EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid,
CASE Employees.APV_MGR_EMP_ID
WHEN Null THEN '0'
ELSE Employees.APV_MGR_EMP_ID
END as ApprovalManagerId
FROM
dbo.[tEmployees] as Employees WITH (NOLOCK)
WHERE
APV_MGR_EMP_ID = @Id
and Employees.APV_MGR_EMP_ID is not null
and Employees.EMP_SRC_ID_NR is not null
UNION ALL
SELECT
EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid,
CASE Employees.UPS_ACP_EMP_NR
WHEN Null THEN '1'
ELSE Employees.UPS_ACP_EMP_NR
END as ApprovalManagerId
FROM
dbo.[tEmployees] as Employees WITH (NOLOCK)
WHERE
UPS_ACP_EMP_NR = @Id
and Employees.APV_MGR_EMP_ID is not null
and Employees.EMP_SRC_ID_NR is not null
UNION ALL
SELECT
Employees.EMP_SRC_ID_NR, Employees.USR_ACV_DIR_ID_TE,
CASE Employees.APV_MGR_EMP_ID
WHEN Null THEN '2'
ELSE Employees.APV_MGR_EMP_ID
END
FROM
dbo.[tEmployees] as Employees WITH (NOLOCK)
JOIN
EmployeeTree ON Employees.APV_MGR_EMP_ID = EmployeeTree.Id
where
Employees.APV_MGR_EMP_ID is not null
and Employees.EMP_SRC_ID_NR is not null
)
SELECT
Id AS [EmployeeId],
Uuid AS [EmployeeUuid],
ApprovalManagerId AS [ManagerId]
FROM EmployeeTree
【问题讨论】:
此行可以替换为COALESCE()
: CASE Employees.APV_MGR_EMP_ID WHEN Null THEN '0' ELSE Employees.APV_MGR_EMP_ID END as ApprovalManagerId
= COALESCE(Employees.APV_MGR_EMP_ID, 0) AS ApprovalManagerID
【参考方案1】:
这只是一个避免最大递归错误的示例。我们必须使用 选项(maxrecursion 365);或选项(maxrecursion 0);
DECLARE @STARTDATE datetime;
DECLARE @EntDt datetime;
set @STARTDATE = '01/01/2009';
set @EntDt = '12/31/2009';
declare @dcnt int;
;with DateList as
(
select @STARTDATE DateValue
union all
select DateValue + 1 from DateList
where DateValue + 1 < convert(VARCHAR(15),@EntDt,101)
)
select count(*) as DayCnt from (
select DateValue,DATENAME(WEEKDAY, DateValue ) as WEEKDAY from DateList
where DATENAME(WEEKDAY, DateValue ) not IN ( 'Saturday','Sunday' )
)a
option (maxrecursion 365);
【讨论】:
【参考方案2】:在查询末尾指定maxrecursion option:
...
from EmployeeTree
option (maxrecursion 0)
这允许您指定 CTE 在生成错误之前可以递归的频率。 Maxrecursion 0 允许无限递归。
【讨论】:
嗯,这行得通,但查询返回的行数比它应该有的多得多 @bugz Maxrecursion 0 现在确实会影响您的查询,您是否需要在其他地方寻找问题 啊,这是我数据中的循环引用,感谢您的帮助 +1 我使用这个选项来调试类似的问题。如果查询是无限递归的,您必须在执行后在 Management Studio 中取消查询,否则服务器将假脱机行,直到您的客户端内存不足。 虽然这可能会在您希望查询递归非常深的情况下解决问题,但它可能只是掩盖了查询中的问题。以上是关于最大递归 100 在语句完成之前已经用完的主要内容,如果未能解决你的问题,请参考以下文章