2012-03-10 69 views
88

我一直在使用此查詢獲得最大遞歸錯誤。語句完成之前最大遞歸100已用盡

起初我還以爲是因爲返回一個空了,然後它會嘗試和匹配但是導致錯誤的空值,我重寫我的查詢,以便空不回來了,仍然出現錯誤。

什麼是最好的方式來改寫這個功能,這樣就不會出現錯誤

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   

回答

167

在查詢結束指定maxrecursion option

... 
from EmployeeTree 
option (maxrecursion 0) 

這讓你指定CTE在產生錯誤之前可以執行的頻率。 Maxrecursion 0允許無限遞歸。

+0

嗯這個工作,但該查詢返回了更多行,那麼它應該有 – 2012-03-10 20:59:45

+4

@bugz MAXRECURSION 0不會影響現在您的查詢,你必須尋找這個問題在其他地方 – 2012-03-10 21:07:29

+2

啊,這是一個圓形refrence在我的數據,感謝您的幫助 – 2012-03-10 21:13:08

14

它只是避免最大遞歸誤差的樣本。我們必須使用選項(maxrecursion 365);或選項(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);