Maksimum özyineleme 100 ifadenin tamamlanmasından önce tükendi


136

Ben max recursion errorbu sorgu ile almaya devam .

İlk başta null döndürülüyordu ve sonra hataya neden olan null değerleri eşleştirmeye çalışacağını düşündüm, ancak null'ların döndürülmemesi ve hata hala oluşması için sorgumu yeniden yazdım.

Bu işlevi yeniden yazmanın en iyi yolu ne olur, böylece hata oluşmaz

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        

Bu satır aşağıdaki ile değiştirilebilir 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

Yanıtlar:


249

Sorgunun sonundaki maksrecursion seçeneğini belirtin :

...
from EmployeeTree
option (maxrecursion 0)

Bu, bir hata oluşturmadan önce CTE'nin ne sıklıkta geri çekilebileceğini belirlemenizi sağlar. Maxrecursion 0 sonsuz tekrarlamaya izin verir.


1
hmm bu çalıştı ama sorgu çok daha fazla satır döndü o zaman olması gerekir
HELP_ME

5
@bugz Maxrecursion 0 şimdi sorgunuzu etkiliyor, sorunu başka bir yerde aramak zorunda mısınız
t-clausen.dk

6
ahh verilerimde dairesel bir
referanstı

3
+1 Bu seçeneği benzer bir sorunu ayıklamak için kullandım. Sorgu sonsuza kadar özyinelemeli ise, sorguyu yürüttükten sonra Management Studio'da iptal etmeniz gerekir; aksi takdirde sunucu istemcinizin belleği bitene kadar satırları biriktirir.
Iain Samuel McLean Elder

1
Bu, sorgunun çok derinden okunmasını istediğiniz durumlarda sorunu düzeltebilir, ancak yalnızca sorguda bir sorun maskeliyor olabilir.
Christian Findlay

24

maksimum özyineleme hatasını önlemek için sadece bir örnektir. seçeneği kullanmalıyız (maxrecursion 365); veya seçenek (maksrecursion 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.