Si tiene que usar absolutamente una función (una limitación de su herramienta ETL como usted lo implica), puede especificar OPTION
como parte de una función con valores de tabla de varias instrucciones, por ejemplo, algo como esto:
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
Esto también funcionó para mí cuando se envolvió en una vista, como sugiere que sus herramientas ETL lo hacen. No hay forma de alterar este sistema, pero como la recursión puede ser ineficiente, probablemente sea algo bueno. No puede especificar una sugerencia de consulta (usando OPTION
) dentro del cuerpo de una función con valores de tabla en línea, como en su ejemplo.
Considere modificar su proceso para recorrer la jerarquía solo una vez cuando reciba sus Episodios y almacene la salida en una tabla relacional. Puede usar un proceso almacenado para hacer esto, de modo que no se encuentre con esta limitación.
También creo que puede haber un error en su código: si su CTE se une a personId y se repite en eventId, el eventId 101 se presentaría dos veces, creo, como un duplicado. Posiblemente he malinterpretado su código, hágame saber lo que piensa.
HTH