Jeśli musisz bezwzględnie użyć funkcji (jak sugerujesz, ograniczenia narzędzia ETL), możesz określić OPTION
jako część funkcji o wielu tabelach, np. Coś takiego:
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
Działa to również dla mnie, gdy jest zawinięty w widok, jak sugerujesz, że twoje narzędzia ETL. Nie ma sposobu, aby zmienić ten system, ale ponieważ rekurencja może być nieefektywna, jest to prawdopodobnie dobra rzecz. Nie można określić wskazówki dotyczącej zapytania (za pomocą OPTION
) w treści wbudowanej funkcji o wartości tabeli, jak w przykładzie.
Zastanów się nad zmianą procesu, aby przejść hierarchię tylko raz, gdy otrzymasz odcinki i zapisz dane wyjściowe w tabeli relacyjnej. Możesz użyć do tego celu zapisanego proc, aby nie napotkać tego ograniczenia.
Wydaje mi się również, że w twoim kodzie może być błąd: jeśli twoje CTE dołącza do personId i powtarza się w eventId, eventId 101 prezentowałby się dwa razy, jak sądzę, jako duplikat. Być może źle zinterpretowałem twój kod, daj mi znać, co myślisz.
HTH