我有一個表FolderXDoc無限循環:TSQL:處理數據
CREATE TABLE [dbo].[FolderXDoc](
[fldid] [int] NOT NULL,
[Xorder] [int] NOT NULL,
[docid] [int] NOT NULL,
CONSTRAINT [FolderXDoc$pk] PRIMARY KEY CLUSTERED
(
[fldid] ASC,
[Xorder] ASC,
[docid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我的應用程序允許在該表中循環引用,所以下面的數據是正確的:
fldid|Xorder|docid
1|1|2
2|1|3
3|1|4
4|1|2
所以文件夾1中包含文件夾2包含文件夾3.文件夾3包含文件夾4.文件夾4包含文件夾2,因此我們有一個循環(1/2/3/4/2/3/4/2/3/4/...)
現在我想檢索一個文件夾中的所有元素遞歸。我在CTE上試了這個,但由於數據的循環,這不起作用。我想在檢測到循環時停止遞歸。所以當我檢索1的包含元素時,我期望結果集(2,3,4)。
我試圖與用戶定義的函數:
CREATE FUNCTION [dbo].[DocChildren](@fldid int)
RETURNS TABLE
AS
RETURN
(
WITH n AS
(SELECT f.fldid, f.docid
FROM folderxdoc f where f.fldid = @fldid
UNION ALL
SELECT n.fldid, nplus1.docid
FROM folderxdoc as nplus1, n
WHERE n.docid = nplus1.fldid and n.docid != @fldid)
SELECT docid FROM n
)
的函數處理的起始ID的循環迴路,而不是當該週期中所包含的元素髮生。 我能做些什麼來解決這個問題?
感謝您的幫助!
你想輸出什麼,當你碰到這些無限循環中的一個?你想讓它顯示第一個完整的鏈?在你上面的例子中,你想要1/2/3/4還是1/2/3/4/2/3/4還是別的? –
您可以在CTE中找到檢測循環的示例[此處](http://stackoverflow.com/questions/15080922/infinite-loop-cte-with-option-maxrecursion-0/15081353#15081353)。它涉及在遞歸和測試重複條目期間組裝路徑。 – HABO
@註冊用戶:感謝您的反饋。我編輯了這個問題。對於包含在1中的所有元素,我的預期結果集爲(2,3,4)。 – carlptr