Nếu bạn hoàn toàn phải sử dụng một hàm (giới hạn của công cụ ETL như bạn ngụ ý), bạn có thể chỉ định OPTION
là một phần của hàm có giá trị bảng nhiều câu lệnh, ví dụ như thế này:
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
Điều này cũng làm việc cho tôi khi được bao bọc trong một khung nhìn như bạn đề xuất các công cụ ETL của bạn. Không có cách nào để thay đổi toàn hệ thống này, nhưng vì đệ quy có thể không hiệu quả, đây có lẽ là một điều tốt. Bạn không thể chỉ định một gợi ý truy vấn (sử dụng OPTION
) trong phần thân của hàm có giá trị bảng nội tuyến, như trong ví dụ của bạn.
Cân nhắc thay đổi quy trình của bạn để đi theo cấu trúc phân cấp chỉ một lần khi bạn nhận được các Tập và lưu trữ đầu ra trong một bảng quan hệ. Bạn có thể sử dụng một Proc được lưu trữ để làm điều này để không gặp phải giới hạn này.
Tôi cũng nghĩ rằng có thể có một lỗi trong mã của bạn: nếu CTE của bạn tham gia vào personId và đệ quy trên eventId, eventId 101 sẽ xuất hiện hai lần tôi nghĩ, như một bản sao. Có thể tôi đã hiểu sai mã của bạn, hãy cho tôi biết bạn nghĩ gì.
HTH