Wenn Sie unbedingt eine Funktion verwenden müssen (eine Einschränkung Ihres ETL-Tools, wie Sie implizieren), können Sie diese OPTION
als Teil einer Funktion mit Tabellenwerten mit mehreren Anweisungen angeben , z.
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
Dies funktionierte auch für mich, wenn ich in eine Ansicht eingebunden wurde, wie Sie es von Ihren ETL-Tools vorschlagen. Es gibt keine Möglichkeit, dies systemweit zu ändern, aber da Rekursion ineffizient sein kann, ist dies wahrscheinlich eine gute Sache. Sie können keinen Abfragehinweis (using OPTION
) im Hauptteil einer Inline-Tabellenwertfunktion angeben , wie in Ihrem Beispiel.
Ändern Sie Ihren Prozess so, dass die Hierarchie nur einmal durchlaufen wird, wenn Sie Ihre Episoden erhalten und die Ausgabe in einer relationalen Tabelle speichern. Sie könnten dazu einen gespeicherten Prozess verwenden, damit diese Einschränkung nicht auftritt.
Ich denke auch, dass es einen Fehler in Ihrem Code geben könnte: Wenn Ihr CTE bei personId beitritt und bei eventId rekursiv ist, würde die eventId 101 meiner Meinung nach zweimal als Duplikat angezeigt. Möglicherweise habe ich Ihren Code falsch interpretiert. Lassen Sie mich wissen, was Sie denken.
HTH