2012-03-10 25 views
88

Tôi tiếp tục nhận được lỗi đệ quy tối đa với truy vấn này. Lúc đầu, tôi nghĩ rằng đó là bởi vì một null đã được trả lại và sau đó nó sẽ cố gắng và phù hợ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 tôi để nulls không được trả lại và lỗi vẫn xảy ra. NGUYÊN NHÂNSố đệ quy tối đa 100 đã cạn kiệt trước khi hoàn thành tuyên bố

Điều gì sẽ là cách tốt nhất để viết lại chức năng này, do đó các lỗi sẽ 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   

Trả lời

167

Xác định maxrecursion option ở phần cuối của các truy vấn:

... 
from EmployeeTree 
option (maxrecursion 0) 

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

+0

hmm này làm việc nhưng truy vấn lại rất nhiều hàng sau đó nó phải có –

+4

@bugz Maxrecursion 0 bây giờ không ảnh hưởng đến truy vấn của bạn, làm bạn phải tìm kiếm các vấn đề khác –

+2

ahh đó là một refrence tròn dữ liệu của tôi, cảm ơn sự giúp đỡ –

14

nó chỉ là mẫu để tránh lỗi đệ quy tối đa. chúng tôi phải sử dụng tùy chọn (tối đa 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); 
Các vấn đề liên quan