Jika Anda benar-benar harus menggunakan fungsi (batasan alat ETL Anda seperti yang Anda maksudkan), Anda dapat menentukan OPTION
sebagai bagian dari fungsi bernilai tabel multi-pernyataan, misalnya sesuatu seperti ini:
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
Ini juga berfungsi untuk saya ketika dibungkus dalam tampilan seperti yang Anda sarankan alat ETL Anda. Tidak ada cara untuk mengubah seluruh sistem ini, tetapi karena rekursi dapat menjadi tidak efisien, ini mungkin merupakan hal yang baik. Anda tidak bisa menentukan petunjuk kueri (menggunakan OPTION
) di dalam tubuh fungsi bernilai tabel inline, seperti dalam contoh Anda.
Pertimbangkan mengubah proses Anda untuk berjalan hierarki hanya sekali ketika Anda menerima Episode Anda dan menyimpan hasilnya dalam tabel relasional. Anda dapat menggunakan proc yang disimpan untuk melakukan ini sehingga tidak akan mengalami batasan ini.
Saya juga berpikir mungkin ada bug dalam kode Anda: jika CTE Anda bergabung di personId dan berulang di eventId, eventId 101 akan muncul dua kali saya pikir, sebagai duplikat. Mungkin saya salah mengartikan kode Anda, beri tahu saya pendapat Anda.
HTH