Se devi assolutamente utilizzare una funzione (una limitazione del tuo strumento ETL come intendi), puoi specificare OPTION
come parte di una funzione con valori di tabella multiistruzione, ad esempio qualcosa del genere:
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
Questo ha funzionato anche per me se visto in una prospettiva come suggerisce i tuoi strumenti ETL. Non c'è modo di modificare tutto questo sistema, ma poiché la ricorsione può essere inefficiente, questa è probabilmente una buona cosa. Non è possibile specificare un suggerimento per la query (usando OPTION
) all'interno del corpo di una funzione con valori di tabella incorporata, come nell'esempio.
Prendi in considerazione la possibilità di modificare il tuo processo per seguire la gerarchia solo una volta quando ricevi gli episodi e memorizzi l'output in una tabella relazionale. È possibile utilizzare un proc memorizzato per fare ciò in modo da non incorrere in questa limitazione.
Penso anche che potrebbe esserci un bug nel tuo codice: se il tuo CTE si unisce a personId e recluta su eventId, l'eventoId 101 presenterebbe due volte penso, come duplicato. Forse ho frainteso il tuo codice, fammi sapere cosa ne pensi.
HTH