语法执行前已达到最大递归次数100

178

我用这个查询一直出现最大递归错误

起初,我以为是因为返回了 null 值,然后尝试匹配 null 值导致错误,但是,我重新编写了查询,使 null 值不会被返回,但错误仍然发生。

重写这个函数的最佳方法是什么,以便不会出现错误?

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 - David Faber
2个回答

326

在查询末尾指定maxrecursion选项

...
from EmployeeTree
option (maxrecursion 0)

这允许您指定通用表达式(CTE)在生成错误之前可以递归多少次。Maxrecursion 0允许无限递归。


1
这个好像可以运行,但是查询返回的行数比应该返回的多很多。 - HELP_ME
5
最大递归深度为0现在会影响你的查询,你需要在其他地方寻找问题。 - t-clausen.dk
6
啊,我的数据中有一个循环引用,谢谢你的帮助。 - HELP_ME
3
+1 我曾使用此选项来调试类似的问题。如果查询出现无限递归,您必须在执行查询后在管理工作室中取消查询,否则服务器将缓冲行直到客户端内存耗尽。 - Iain Samuel McLean Elder
1
虽然这可能会解决在需要查询深度递归的情况下出现的问题,但它可能只是掩盖了查询中的问题。 - Christian Findlay

42

这只是一个示例,以避免最大递归错误。我们必须使用option (maxrecursion 365); 或 option (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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接