यदि आप अपने स्तर के क्षेत्र के साथ केवल इतना करना चाहते हैं कि रिकर्सन की संख्या सीमित है, तो आपको MAXRECURSION
क्वेरी संकेत
, कुछ इस तरह:
WITH Department_CTE AS
(
SELECT
DepartmentGroupKey,
ParentDepartmentGroupKey,
DepartmentGroupName
FROM dimDepartmentGroup
WHERE DepartmentGroupKey = 2
UNION ALL
SELECT
Child.DepartmentGroupKey,
Child.ParentDepartmentGroupKey,
Child.DepartmentGroupName
FROM Department_CTE AS Parent
JOIN DimDepartmentGroup AS Child
ON Parent.ParentDepartmentGroupKey = Child.DepartmentGroupKey
)
SELECT * FROM Department_CTE
OPTION (MAXRECURSION 2)
संपादित करें:
टिप्पणियों में प्रश्न के उत्तर में, नहीं, आप अपनी MAXRECURSION सेटिंग की अनुमति से अधिक बार रिकर्स करते समय प्राप्त होने वाली त्रुटि को दबा नहीं सकते। अगर मैं आपको सही ढंग से समझूं, तो आप कुछ ऐसा कर सकते हैं:
WITH CTE AS
(
-- Start CTE off by selecting the task that was provided to stored procedure.
SELECT Id, 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.Id, [Level] + 1
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
WHERE [Level] < 2
),
CTE2 AS
(
SELECT TestTable.*
FROM CTE
INNER JOIN TestTable ON CTE.Id = TestTable.Id
)
SELECT * FROM CTE2;
यह उतना ही सामान्य होना चाहिए जितना आपके ऊपर है, यह मानते हुए कि आप पदानुक्रम या प्राथमिक कुंजी फ़ील्ड को बदलने की योजना नहीं बना रहे हैं।