यदि आपको पूरी तरह से एक फ़ंक्शन (अपने ईटीएल उपकरण की एक सीमा जैसा कि आप कहते हैं) का उपयोग करना होगा, तो आप 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
एक इनलाइन तालिका-मूल्यवान फ़ंक्शन के शरीर के भीतर एक क्वेरी संकेत (उपयोग ) निर्दिष्ट नहीं कर सकते , जैसा कि आपके उदाहरण में।
जब आप अपने एपिसोड प्राप्त करते हैं तो पदानुक्रम चलने के लिए अपनी प्रक्रिया को बदलने पर विचार करें और आउटपुट को संबंधपरक तालिका में संग्रहीत करें। आप ऐसा करने के लिए एक संग्रहित खरीद का उपयोग कर सकते हैं ताकि इस सीमा में न चला जाए।
मुझे भी लगता है कि आपके कोड में एक बग हो सकता है: यदि आपका CTE personId पर जुड़ता है और EventId पर पुन: जुड़ता है, तो EventId 101 मैं दो बार प्रस्तुत करता हूं, मुझे एक डुप्लिकेट के रूप में लगता है। संभवतः मैंने आपके कोड की गलत व्याख्या की है, मुझे बताएं कि आप क्या सोचते हैं।
HTH