Se você precisar absolutamente usar uma função (uma limitação da sua ferramenta ETL, como você sugere), poderá especificar OPTION
como parte de uma função com valor de tabela com várias instruções, por exemplo, algo como isto:
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
Isso também funcionou para mim quando envolvido em uma exibição, como você sugere suas ferramentas ETL. Não há como alterar isso em todo o sistema, mas como a recursão pode ser ineficiente, isso provavelmente é uma coisa boa. Você não pode especificar uma dica de consulta (usando OPTION
) no corpo de uma função embutida com valor de tabela, como no seu exemplo.
Considere alterar seu processo para percorrer a hierarquia apenas uma vez ao receber seus episódios e armazenar a saída em uma tabela relacional. Você pode usar um procedimento armazenado para fazer isso, para não entrar nessa limitação.
Eu também acho que pode haver um erro no seu código: se o seu CTE se unir a personId e se repetir em eventId, o eventId 101 apresentaria duas vezes, como uma duplicata. Possivelmente, eu interpretei mal o seu código, deixe-me saber o que você pensa.
HTH