Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment limiter la profondeur de récursivité CTE mais sélectionner une table générique ?

Si tout ce que vous voulez faire avec votre champ de niveau est de limiter le nombre de récursions, vous devriez pouvoir utiliser un MAXRECURSION indice de requête , quelque chose comme ceci :

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)

Modifier :

En réponse à la question dans les commentaires, non, vous ne pouvez pas supprimer l'erreur que vous obtenez lorsque vous répétez plus de fois que votre paramètre MAXRECURSION ne le permet. Si je vous comprends bien, vous pourriez faire quelque chose comme ceci :

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;

Cela devrait être aussi générique que ce que vous avez ci-dessus, en supposant que vous ne prévoyez pas de modifier les champs de clé hiérarchique ou primaire.