Đệ quy tối đa 100 đã hết trước khi hoàn thành câu lệnh


136

Tôi tiếp tục nhận được max recursion errorvới một truy vấn này.

Lúc đầu, tôi nghĩ rằng đó là do null được trả về và sau đó nó sẽ thử và khớp với các giá trị null gây ra lỗi, tuy nhiên, tôi đã viết lại truy vấn của mình để null không được trả về và lỗi vẫn xảy ra.

Điều gì sẽ là cách tốt nhất để viết lại chức năng này, để lỗi không xảy ra

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        

Dòng này có thể được thay thế bằng 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

Câu trả lời:


249

Chỉ định tùy chọn maxrecursion ở cuối truy vấn:

...
from EmployeeTree
option (maxrecursion 0)

Điều đó cho phép bạn chỉ định tần suất CTE có thể lặp lại trước khi tạo ra lỗi. Maxrecursion 0 cho phép đệ quy vô hạn.


1
hmm cái này hoạt động nhưng truy vấn trả về nhiều hàng hơn thì nó nên có
HELP_ME

5
@bugz Maxrecursion 0 hiện không ảnh hưởng đến truy vấn của bạn, bạn có phải tìm kiếm vấn đề ở nơi khác không
t-clausen.dk

6
ahh đó là một sự điều chỉnh vòng tròn trong dữ liệu của tôi, cảm ơn vì sự giúp đỡ
HELP_ME

3
+1 Tôi đã sử dụng tùy chọn này để gỡ lỗi một vấn đề tương tự. Nếu truy vấn là đệ quy vô hạn, bạn phải hủy truy vấn trong Management Studio sau khi thực hiện nó hoặc máy chủ sẽ lưu các hàng cho đến khi máy khách của bạn hết bộ nhớ.
Iain Samuel McLean Elder

1
Mặc dù điều này có thể khắc phục sự cố trong các tình huống mà bạn muốn truy vấn lặp lại rất sâu, nhưng nó có thể chỉ che giấu một vấn đề trong truy vấn.
Christian Findlay

24

nó chỉ là một mẫu để tránh lỗi đệ quy tối đa. chúng ta phải sử dụng tùy chọn (maxrecursion 365); hoặc tùy chọn (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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.