関数(暗黙のETLツールの制限)を絶対に使用する必要がある場合OPTION
は、マルチステートメントテーブル値関数の一部として、たとえば次のように指定できます。
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
これは、ETLツールのようにビューにラップしたときにも機能しました。これをシステム全体で変更する方法はありませんが、再帰は効率が悪い場合があるため、これはおそらく良いことです。OPTION
例のように、インラインテーブル値関数の本体内で(を使用して)クエリヒントを指定することはできません。
エピソードを受信してリレーショナルテーブルに出力を格納するときに、階層を1回だけ歩くようにプロセスを変更することを検討してください。ストアドプロシージャを使用してこれを行うことができるため、この制限にぶつかることはありません。
また、コードにバグがある可能性があると思います。CTEがpersonIdに参加し、eventIdで再帰する場合、eventId 101が重複して2回表示されると思います。おそらく私はあなたのコードを誤って解釈したので、あなたの考えを知らせてください。
HTH