Якщо вам абсолютно доведеться використовувати функцію (обмеження вашого інструменту ETL, як ви розумієте), ви можете вказати OPTION
як частину функції багатозначних операцій з таблицею, наприклад щось подібне:
CREATE FUNCTION dbo.udf_MyFunction ( @StartID INT )
RETURNS @tv TABLE
(
id INT
)
AS
BEGIN
WITH Episodes( xlevel, PersonID, EventID, EpisodeID, StartDT, EndDT ) AS (
-- Anchor case - the first EventID for each person.
SELECT 1 AS xlevel, PersonID, EventID, @StartID, StartDT, EndDT
FROM dbo.EventTable
WHERE EventID = @StartID
UNION ALL
SELECT xlevel + 1, et.PersonID, et.EventID, c.EventID + 1, et.StartDT, et.EndDT
FROM Episodes c
INNER JOIN dbo.EventTable et ON c.PersonID = et.PersonID
AND et.EventID = c.EventID + 1
--WHERE c.EventID <= (@StartID + 99)
)
INSERT INTO @tv
SELECT PersonID
FROM Episodes
OPTION ( MAXRECURSION 1000 )
RETURN
END
GO
Це також спрацювало для мене, коли ви переконалися, що ви пропонуєте свої інструменти ETL. Немає можливості змінити цю систему в цілому, але оскільки рекурсія може бути неефективною, це, мабуть, добре. Ви не можете вказати підказку (використовуючи OPTION
) в тілі функції вбудованої таблиці, як у вашому прикладі.
Подумайте про зміну свого процесу для проходження ієрархії лише один раз, коли ви отримуєте епізоди та зберігаєте результати у реляційній таблиці. Ви можете використовувати збережений додаток для цього, щоб не стикатися з цим обмеженням.
Я також думаю, що у вашому коді може виникнути помилка: якщо ваш CTE приєднується до personId і повторюється у eventId, eventId 101 відображатиметься двічі, я думаю, як дублікат. Можливо, я неправильно трактував ваш код, дайте мені знати, що ви думаєте.
HTH