Rekursi maksimum 100 telah habis sebelum pernyataan selesai


140

Saya terus mendapatkan max recursion errordengan kueri ini.

Awalnya saya pikir itu karena null dikembalikan dan kemudian akan mencoba dan mencocokkan nilai null yang menyebabkan kesalahan, namun, saya menulis ulang kueri saya sehingga null tidak dikembalikan dan kesalahan masih terjadi.

Apa cara terbaik untuk menulis ulang fungsi ini, sehingga kesalahan tidak akan terjadi

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        

Baris ini dapat diganti dengan 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

Jawaban:


252

Tentukan opsi maxrecursion di akhir kueri:

...
from EmployeeTree
option (maxrecursion 0)

Itu memungkinkan Anda untuk menentukan seberapa sering CTE dapat berulang sebelum menghasilkan kesalahan. Maxrecursion 0 memungkinkan rekursi tak terbatas.


1
hmm ini berhasil tetapi kueri mengembalikan lebih banyak baris daripada yang seharusnya
HELP_ME

5
@bugz Maxrecursion 0 sekarang tidak memengaruhi kueri Anda, apakah Anda harus mencari masalah di tempat lain
t-clausen.dk

6
ahh itu
refensi

3
+1 Saya menggunakan opsi ini untuk men-debug masalah serupa. Jika kueri bersifat rekursif tanpa batas, Anda harus membatalkan kueri di Studio Manajemen setelah menjalankannya atau server akan menggulung baris hingga klien Anda kehabisan memori.
Iain Samuel McLean Penatua

1
Meskipun ini mungkin memperbaiki masalah dalam situasi di mana Anda ingin kueri berulang sangat dalam, ini mungkin hanya menutupi masalah dalam kueri.
Christian Findlay

27

itu hanya contoh untuk menghindari kesalahan rekursi maksimal. kita harus menggunakan opsi (maxrecursion 365); atau opsi (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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.