Hiện nay chúng tôi có một thủ tục lưu trữ mà trả về dữ liệu từ một bảng trong đó là sơ đồ ban đầu bằng cách làm một cái gì đó như thế này:Làm thế nào để giới hạn độ sâu đệ quy CTE nhưng chọn bảng chung?
WITH CTE AS
(
-- Start CTE off by selecting the id that was provided to stored procedure.
SELECT *
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of records already found in previous iterations.
UNION ALL
SELECT t.*
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
)
SELECT *
FROM CTE
này là tốt đẹp, bởi vì không có vấn đề thay đổi sơ đồ bảng, miễn là có cách [ Id] và [ParentId] cột, tôi sẽ không phải cập nhật thủ tục được lưu trữ này. Tôi muốn làm một cái gì đó tương tự, nhưng cũng có thể xác định chiều sâu của đệ quy động. Cách duy nhất tôi đã nhìn thấy để làm điều này là thêm một tốt nghiệp/Thực nhận dạng sâu như vậy:
WITH CTE AS
(
-- Start CTE off by selecting the task that was provided to stored procedure.
SELECT *, 0 as [Level]
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
UNION ALL
SELECT t.*, [Level] + 1
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
WHERE [Level] < 2
)
SELECT *
FROM CTE
này hoạt động tốt, nhưng mất đi những lợi thế lớn của truy vấn trước đó kể từ khi chọn *
ở cuối sẽ cho tôi là cấp độ. Có cách nào khác để làm điều này, nơi tôi có thể chỉ định một mức độ, nhưng cũng thường chọn tất cả các cột từ bảng? Cảm ơn trước.
Điều đó có vẻ như đã xảy ra lỗi khi đạt đến giới hạn. Có cách nào để dừng nó dựa trên MAXRECURSION, nhưng tiếp tục sử dụng kết quả? – Ocelot20
Đã trả lời ở trên (có đề xuất khác) ... – mwigdahl