Рекурсивный CTE с использованием функции в рекурсивном члене - PullRequest
0 голосов
/ 14 января 2020

Мне нужно создать список со всеми подстатьями (со всех уровней) данной статьи. Чтобы получить только дочернюю статью родительской статьи, я использую функцию GetArticleGroup (ArticleId, Index).

Выполнение функции вернет что-то вроде этого:

TRANS_ID    ARTICLE_GROUP_ID    ARTICLE_TRANS_ID    PIECES  SEQUENCE_NO DESCRIPTION IS_CHANGED  ART_INDEX
1   55  56  1   1       0   A
2   55  57  1   2       0   A

Это то, что я пытался безуспешно:

WITH Subarticles AS (
    SELECT ARTICLE_TRANS_ID, ART_INDEX, cast(ARTICLE_TRANS_ID as varchar(max)) levels FROM dbo.GetArticleGroup(55, 'A') AG 
        UNION ALL
    SELECT S.ARTICLE_TRANS_ID, S.ART_INDEX, S.levels+','+cast(S.ARTICLE_TRANS_ID as varchar(max)) levels FROM Subarticles S
        CROSS APPLY 
    GetArticleGroup(S.ARTICLE_TRANS_ID, S.ART_INDEX) g where CHARINDEX(CAST(g.ARTICLE_TRANS_ID AS varchar(max)), s.levels)=0
)
SELECT top 30 ARTICLE_TRANS_ID, ART_INDEX, levels FROM Subarticles OPTION (maxrecursion 1000)

Ожидание:

56, A
57, A
58, A

То, что я получаю вместо этого, бесконечно l oop:

56, A
57, A
57, A
...
57, A

Спасибо,

...