2012-03-10 10 views
88

Ciągle otrzymuję maksymalny błąd rekursji w tym zapytaniu.Maksymalna rekurencja 100 została wyczerpana przed zakończeniem instrukcji.

Najpierw myślałem, że to dlatego, że zwrócono wartość zerową, a następnie spróbowałbym dopasować wartości zerowe powodujące błąd, jednak przepisałem moje zapytanie, aby null nie zostały zwrócone, a błąd nadal występuje.

Jaki byłby najlepszy sposób do przepisać tej funkcji, tak, że błąd nie wystąpi

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   

Odpowiedz

167

Określ maxrecursion option na końcu zapytania:

... 
from EmployeeTree 
option (maxrecursion 0) 

, który pozwala na określić, jak często CTE może się powtarzać przed wygenerowaniem błędu. Maxrecursion 0 pozwala na nieskończoną rekursję.

+0

hmm to działało ale zapytanie zwróciło wiele więcej wierszy to powinno mieć –

+4

@bugz Maxrecursion 0 ma teraz wpłynąć zapytanie, czy trzeba szukać problemu gdzie indziej –

+2

ahh to był okrągły w refrence moje dane, dzięki za pomoc –

14

to tylko próbka, aby uniknąć błędu maksymalnej rekurencji. musimy użyć opcji (maxrecursion 365); lub opcja (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); 
Powiązane problemy