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>
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>
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!