Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Membetulkan Ralat 'Rekursi maksimum 100 telah habis' dalam CTE Rekursif SQL?

Bagaimanakah Saya Boleh Membetulkan Ralat 'Rekursi maksimum 100 telah habis' dalam CTE Rekursif SQL?

Susan Sarandon
Lepaskan: 2025-01-10 07:10:41
asal
204 orang telah melayarinya

How Can I Fix

Menyelesaikan Masalah Ralat CTE Rekursif SQL: Melebihi Had Rekursi

Pertanyaan SQL yang menggunakan Ungkapan Jadual Biasa (CTE) rekursif sering melanda ralat "rekursif maksimum 100 habis". Ini timbul apabila panggilan rekursif CTE melebihi had rekursif lalai (biasanya 100).

Menyelesaikan Ralat CTE Rekursif dengan Mengubah Suai Pertanyaan

Mari kita ilustrasikan dengan contoh mendapatkan semula data pekerja dan pengurus kelulusan hierarki mereka:

<code class="language-sql">WITH EmployeeTree AS (
    -- Anchor member of the CTE (initial query)
    ...
    UNION ALL
    SELECT 
        Employees.EMP_SRC_ID_NR, Employees.USR_ACV_DIR_ID_TE, 
        ISNULL(Employees.APV_MGR_EMP_ID, '2')  -- Simplified NULL handling
    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        </code>
Salin selepas log masuk

Penyelesaian melibatkan klausa OPTION (MAXRECURSION):

<code class="language-sql">WITH EmployeeTree AS (
    -- Anchor member of the CTE (initial query)
    ...
    UNION ALL
    SELECT ...
    FROM ...
    JOIN EmployeeTree ON ...
)
OPTION (MAXRECURSION 0)
SELECT ...
FROM EmployeeTree        </code>
Salin selepas log masuk

Klausa ini mengawal kedalaman rekursi CTE. Menetapkan MAXRECURSION kepada 0 melumpuhkan had rekursi, dengan berkesan menghalang ralat. Walau bagaimanapun, berhati-hati dinasihatkan: Rekursi tak terhingga boleh membawa kepada isu prestasi atau ranap jika data hierarki tidak berstruktur dengan betul atau mengandungi rujukan bulat. Semak data dan logik CTE anda dengan teliti untuk memastikan ia ditamatkan dengan betul sebelum menggunakan MAXRECURSION 0. Penyelesaian yang lebih mantap mungkin melibatkan penetapan MAXRECURSION kepada nilai yang lebih tinggi, tetapi terhingga, atau menganalisis data untuk kemungkinan gelung tak terhingga.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membetulkan Ralat 'Rekursi maksimum 100 telah habis' dalam CTE Rekursif SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan