Saya terus mendapatkan max recursion error
dengan kueri ini.
Awalnya saya pikir itu karena null dikembalikan dan kemudian akan mencoba dan mencocokkan nilai null yang menyebabkan kesalahan, namun, saya menulis ulang kueri saya sehingga null tidak dikembalikan dan kesalahan masih terjadi.
Apa cara terbaik untuk menulis ulang fungsi ini, sehingga kesalahan tidak akan terjadi
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
sql
stored-procedures
common-table-expression
TOLONG AKU
sumber
sumber
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
Jawaban:
Tentukan opsi maxrecursion di akhir kueri:
Itu memungkinkan Anda untuk menentukan seberapa sering CTE dapat berulang sebelum menghasilkan kesalahan. Maxrecursion 0 memungkinkan rekursi tak terbatas.
sumber
itu hanya contoh untuk menghindari kesalahan rekursi maksimal. kita harus menggunakan opsi (maxrecursion 365); atau opsi (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);
sumber