La récursivité maximale 100 a été épuisée avant la fin de l'instruction


136

Je reçois toujours un max recursion erroravec cette requête.

Au début, je pensais que c'était parce qu'un null était renvoyé, puis il essaierait de faire correspondre les valeurs nulles à l'origine de l'erreur.Cependant, j'ai réécrit ma requête pour que les valeurs nulles ne soient pas renvoyées et que l'erreur se produise toujours.

Quelle serait la meilleure façon de réécrire cette fonction, afin que l'erreur ne se produise pas

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        

Cette ligne pourrait être remplacée par 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

Réponses:


249

Spécifiez l' option maxrecursion à la fin de la requête:

...
from EmployeeTree
option (maxrecursion 0)

Cela vous permet de spécifier à quelle fréquence le CTE peut récurer avant de générer une erreur. Maxrecursion 0 permet une récursion infinie.


1
hmm cela a fonctionné mais la requête a renvoyé beaucoup plus de lignes qu'elle n'aurait dû
HELP_ME

5
@bugz Maxrecursion 0 affecte maintenant votre requête, devez-vous chercher le problème ailleurs
t-clausen.dk

6
ahh c'était une réfraction circulaire dans mes données, merci pour l'aide
HELP_ME

3
+1 J'ai utilisé cette option pour déboguer un problème similaire. Si la requête est infiniment récursive, vous devez annuler la requête dans Management Studio après son exécution ou le serveur spoulera les lignes jusqu'à ce que votre client soit à court de mémoire.
Iain Samuel McLean Elder

1
Bien que cela puisse résoudre le problème dans les situations où vous souhaitez que la requête se répète très profondément, cela peut simplement masquer un problème dans la requête.
Christian Findlay

24

ce n'est qu'un exemple pour éviter une erreur de récursivité maximale. nous devons utiliser l' option (maxrecursion 365); ou 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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.