Die maximale Rekursion 100 wurde vor Abschluss der Anweisung erschöpft

136

Ich bekomme immer wieder eine max recursion errorFrage.

Zuerst dachte ich, es liege daran, dass eine Null zurückgegeben wurde, und dann würde versucht, die Nullwerte zu ermitteln, die den Fehler verursacht haben. Ich habe meine Abfrage jedoch neu geschrieben, damit keine Nullen zurückgegeben werden und der Fehler weiterhin auftritt.

Was wäre der beste Weg, um diese Funktion neu zu schreiben, damit der Fehler nicht auftritt

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        
HILF MIR
quelle
Diese Zeile könnte ersetzt werden durch 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

Antworten:

249

Geben Sie die MAXRECURSION Option am Ende der Abfrage:

...
from EmployeeTree
option (maxrecursion 0)

Auf diese Weise können Sie festlegen, wie oft der CTE wiederholt werden kann, bevor ein Fehler generiert wird. Maxrecursion 0 ermöglicht eine unendliche Rekursion.

Andomar
quelle
1
hmm das hat funktioniert, aber die Abfrage hat viel mehr Zeilen zurückgegeben, als es hätte sein sollen
HELP_ME
5
@bugz Maxrecursion 0 wirkt sich jetzt auf Ihre Abfrage aus. Müssen Sie das Problem an anderer Stelle suchen
t-clausen.dk
6
ahh es war eine zirkuläre Auffrischung in meinen Daten, danke für die Hilfe
HELP_ME
3
+1 Ich habe diese Option verwendet, um ein ähnliches Problem zu debuggen. Wenn die Abfrage unendlich rekursiv ist, müssen Sie die Abfrage in Management Studio nach der Ausführung abbrechen. Andernfalls spoolt der Server Zeilen, bis Ihrem Client der Speicher ausgeht.
Iain Samuel McLean Elder
1
Während dies das Problem in Situationen beheben kann, in denen die Abfrage sehr tief zurücklaufen soll, wird möglicherweise nur ein Problem in der Abfrage maskiert.
Christian Findlay
24

Dies ist nur ein Beispiel, um einen maximalen Rekursionsfehler zu vermeiden. wir müssen die Option verwenden (maxrecursion 365); oder 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);
Mou
quelle