2012-03-10 1 views
88

Continuo a ricevere un errore di ricorsione massimo con questa query.La ricorsione massima 100 è stata esaurita prima del completamento dell'istruzione

All'inizio pensavo fosse perché veniva restituito un valore null e quindi tentava di associare i valori nulli che causavano l'errore, tuttavia, ho riscritto la mia query in modo che i valori nulli non vengano restituiti e l'errore si verifichi ancora.

Quale sarebbe il modo migliore per riscrivere questa funzione, in modo che l'errore non si verificherà

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   

risposta

167

Specificare il maxrecursion option alla fine della query:

... 
from EmployeeTree 
option (maxrecursion 0) 

che consente di specificare la frequenza con cui il CTE può ricorrere prima di generare un errore. Maxrecursion 0 consente la ricorsione infinita.

+0

hmm questo ha funzionato, ma la query restituita molto più righe allora dovrebbe avere –

+4

@bugz MAXRECURSION 0 non oggi colpiscono la tua ricerca, devi cercare il problema altrove –

+2

ahh è stato un refrence circolare i miei dati, grazie per l'aiuto –

14

è solo un esempio per evitare il massimo errore di ricorsione. dobbiamo usare l'opzione (maxrecursion 365); o opzione (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);