Kesinlikle bir işlev kullanmak zorundaysanız (ima ettiğiniz gibi ETL aracınızın bir sınırlaması), OPTION
çok ifadeli tablo değerli bir işlevin parçası olarak belirtebilirsiniz , örneğin, böyle bir şey:
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
Bu, ETL araçlarınızın önerdiği gibi bir görünümde sarıldığında da benim için çalıştı. Bu sistemi tümüyle değiştirmenin bir yolu yoktur, ancak özyineleme verimsiz olabileceğinden, bu muhtemelen iyi bir şeydir. OPTION
Örneğin, satır içi tablo değerli bir işlev gövdesi içinde bir sorgu ipucu (kullanarak ) belirtemezsiniz .
Bölümlerinizi aldığınızda ve çıktıyı ilişkisel bir tabloda sakladığınızda hiyerarşiyi yürütebilmek için işleminizi değiştirmeyi düşünün. Bunu yapmak için depolanmış bir proc kullanabilirsiniz, bu nedenle bu sınırlamaya girmezsiniz.
Ayrıca kodunuzda bir hata olabileceğini düşünüyorum: CTE'niz personId'e katılırsa ve eventId'deki recurses'larda, eventId 101, iki kez, bir kopya olarak düşünüyorum. Muhtemelen kodunuzu yanlış yorumladım, ne düşündüğünüzü bana bildirin.
HTH