La recursión máxima 100 se ha agotado antes de completar la declaración

136

Sigo recibiendo un max recursion errorcon esta consulta.

Al principio pensé que era porque se estaba devolviendo un valor nulo y luego intentaría hacer coincidir los valores nulos que causan el error, sin embargo, reescribí mi consulta para que no se devuelvan los valores nulos y el error aún ocurra.

¿Cuál sería la mejor manera de reescribir esta función, para que no se produzca el 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        
AYUADAME
fuente
Esta línea podría ser reemplazada por 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

Respuestas:

249

Especifique la opción maxrecursion al final de la consulta:

...
from EmployeeTree
option (maxrecursion 0)

Eso le permite especificar con qué frecuencia puede repetirse el CTE antes de generar un error. Maxrecursion 0 permite una recursión infinita.

Andomar
fuente
1
hmm esto funcionó pero la consulta devolvió muchas más filas de lo que debería haber sido
HELP_ME
55
@bugz Maxrecursion 0 ahora afecta su consulta, ¿tiene que buscar el problema en otra parte
t-clausen.dk
66
ahh fue una referencia circular en mis datos, gracias por la ayuda
HELP_ME
3
+1 Usé esta opción para depurar un problema similar. Si la consulta es infinitamente recursiva, debe cancelar la consulta en Management Studio después de ejecutarla o el servidor pondrá en cola las filas hasta que su cliente se quede sin memoria.
Iain Samuel McLean Élder
1
Si bien esto podría solucionar el problema en situaciones en las que desea que la consulta se repita muy profundamente, puede estar enmascarando un problema en la consulta.
Christian Findlay
24

Es solo una muestra para evitar el error de recursión máxima. tenemos que usar la opción (maxrecursion 365); u opción (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);
Mou
fuente