การเรียกซ้ำสูงสุด 100 หมดลงก่อนที่คำสั่งจะเสร็จสมบูรณ์


140

ฉันได้รับmax recursion errorคำถามนี้เรื่อย ๆ

ตอนแรกฉันคิดว่าเป็นเพราะมีการส่งคืนค่าว่างจากนั้นมันจะพยายามจับคู่ค่าว่างทำให้เกิดข้อผิดพลาดอย่างไรก็ตามฉันเขียนแบบสอบถามของฉันใหม่เพื่อไม่ให้ค่าว่างกลับมาและข้อผิดพลาดยังคงเกิดขึ้น

อะไรคือวิธีที่ดีที่สุดในการเขียนฟังก์ชันนี้ใหม่เพื่อไม่ให้เกิดข้อผิดพลาด

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        

บรรทัดนี้สามารถแทนที่ด้วย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

คำตอบ:


252

ระบุตัวเลือก maxrecursionที่ส่วนท้ายของแบบสอบถาม:

...
from EmployeeTree
option (maxrecursion 0)

ซึ่งช่วยให้คุณระบุความถี่ที่ CTE สามารถเรียกคืนได้ก่อนที่จะสร้างข้อผิดพลาด Maxrecursion 0 ช่วยให้สามารถเรียกซ้ำได้ไม่ จำกัด


1
อืมมันใช้งานได้ แต่ข้อความค้นหากลับมีแถวมากกว่านั้นควรมี
HELP_ME

5
ตอนนี้ @bugz Maxrecursion 0 ส่งผลต่อการค้นหาของคุณคุณต้องมองหาปัญหาที่อื่นหรือไม่
t-clausen.dk

6
อ่ามันเป็นการอ้างอิงแบบวงกลมในข้อมูลของฉันขอบคุณสำหรับความช่วยเหลือ
HELP_ME

3
+1 ฉันใช้ตัวเลือกนี้เพื่อแก้ไขปัญหาที่คล้ายกัน หากคิวรีวนซ้ำไม่สิ้นสุดคุณต้องยกเลิกคิวรีใน Management Studio หลังจากดำเนินการแล้วมิฉะนั้นเซิร์ฟเวอร์จะสปูลแถวจนกว่าไคลเอ็นต์ของคุณจะมีหน่วยความจำหมด
Iain Samuel McLean Elder

1
แม้ว่าวิธีนี้อาจแก้ไขปัญหาในสถานการณ์ที่คุณต้องการให้แบบสอบถามเรียกคืนลึกมาก แต่อาจเป็นเพียงการปิดบังปัญหาในแบบสอบถาม
Christian Findlay

27

เป็นเพียงตัวอย่างเพื่อหลีกเลี่ยงข้อผิดพลาดในการเรียกซ้ำสูงสุด เราต้องใช้ตัวเลือก (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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.