स्टेटमेंट पूरा होने से पहले अधिकतम 100 पुनरावृत्ति समाप्त हो गई है


136

मैं 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
डेविड फेबर

जवाबों:


249

क्वेरी के अंत में अधिकतम सीमा विकल्प निर्दिष्ट करें :

...
from EmployeeTree
option (maxrecursion 0)

यह आपको यह निर्दिष्ट करने की अनुमति देता है कि त्रुटि पैदा करने से पहले CTE कितनी बार पुनरावृत्ति कर सकता है। मैक्सक्रसियन 0 अनंत पुनरावृत्ति की अनुमति देता है।


1
हम्म ने यह काम किया, लेकिन क्वेरी ने बहुत अधिक पंक्तियों को लौटाया, तो यह होना चाहिए
HELP_ME

5
@bugz Maxrecursion 0 अब आपकी क्वेरी को प्रभावित करता है, क्या आपको समस्या को कहीं और देखना है
t-clausen.dk

6
आह, यह मेरे डेटा में एक वृत्ताकार
खंडन था

3
+1 मैंने इस विकल्प का उपयोग एक समान समस्या को डीबग करने के लिए किया। यदि क्वेरी असीम रूप से पुनरावर्ती है, तो आपको इसे निष्पादित करने के बाद प्रबंधन स्टूडियो में क्वेरी को रद्द करना होगा या जब तक आपका क्लाइंट मेमोरी से बाहर नहीं निकल जाता है, तब तक सर्वर पंक्तियों को छोड़ देगा।
इयान सैमुअल मैकलीन एल्डर

1
हालांकि यह उन स्थितियों में समस्या को ठीक कर सकता है, जहाँ आप चाहते हैं कि क्वेरी बहुत गहरी हो, यह क्वेरी में किसी समस्या का सामना कर रहा है।
क्रिश्चियन फिंडेल

24

यह अधिकतम पुनरावर्तन त्रुटि से बचने के लिए सिर्फ एक नमूना है। हमें विकल्प का उपयोग करना होगा (अधिकतम 365); या विकल्प (अधिकतम वेतन 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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.