Si vous devez absolument utiliser une fonction (une limitation de votre outil ETL comme vous l'impliquez), vous pouvez spécifier OPTION
dans le cadre d'une fonction table multi-instructions, par exemple quelque chose comme ceci:
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
Cela a également fonctionné pour moi lorsqu'il est enveloppé dans une vue, comme vous le suggérez pour vos outils ETL. Il n'y a aucun moyen de modifier ce système, mais comme la récursivité peut être inefficace, c'est probablement une bonne chose. Vous ne pouvez pas spécifier d'indicateur de requête (à l'aide OPTION
) dans le corps d'une fonction de valeur de table en ligne, comme dans votre exemple.
Envisagez de modifier votre processus pour parcourir la hiérarchie une seule fois lorsque vous recevez vos épisodes et stockez la sortie dans une table relationnelle. Vous pouvez utiliser un proc stocké pour ce faire afin de ne pas rencontrer cette limitation.
Je pense également qu'il pourrait y avoir un bug dans votre code: si votre CTE se joint à personId et se reproduit sur eventId, le eventId 101 présenterait deux fois je pense, en double. J'ai peut-être mal interprété votre code, faites-moi savoir ce que vous en pensez.
HTH