หากคุณจำเป็นต้องใช้ฟังก์ชั่นอย่างแน่นอน (ข้อ จำกัด ของเครื่องมือ 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
) ภายในเนื้อความของฟังก์ชั่นค่าตารางแบบอินไลน์เช่นในตัวอย่างของคุณ
พิจารณาการเปลี่ยนแปลงกระบวนการของคุณเพื่อดำเนินการลำดับชั้นเพียงครั้งเดียวเมื่อคุณได้รับตอนของคุณและเก็บผลลัพธ์ในตารางสัมพันธ์ คุณสามารถใช้ proc ที่เก็บไว้เพื่อทำเช่นนี้จะไม่พบข้อ จำกัด นี้
ฉันคิดว่าอาจมีข้อผิดพลาดในรหัสของคุณด้วย: หาก CTE ของคุณเข้าร่วม personId และเรียกคืนใน eventId, eventId 101 จะแสดงสองครั้งที่ฉันคิดว่าเป็นสำเนา อาจเป็นไปได้ว่าฉันตีความรหัสของคุณผิดโปรดแจ้งให้เราทราบว่าคุณคิดอย่างไร
HTH