次のコードが生成されます。ステートメントが終了しました。ステートメントが完了する前に、最大再帰回数 100 を使い果たしました。
すべての親と子のリストを作成しようとしています。ArtikelCEId = 7 は例としてハードコーディングされています。
UNION ALL (親または子の検索) を 1 つだけ指定して CTE を実行すると、完全に機能します。
同じ種類のコーディングについては、http ://sqlmag.com/t-sql/ctes-multiple-recursive-members で説明されています。
create table Article(
ArtikelCEId int,
VervangenDoorArtikelCEId int
)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (1, 2)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (2, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (3, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (5, 7)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (7, 8)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (8, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (9, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (10, null)
;
WITH ArtikelCE_CTE(ArtikelCEId, VervangenDoorArtikelCEId) AS
(
SELECT a.ArtikelCEId, a.VervangenDoorArtikelCEId
from Article a
where a.ArtikelCEId = 7
/*find parents */
UNION ALL
SELECT b.ArtikelCEId, b.VervangenDoorArtikelCEId
FROM ArtikelCE_CTE acteP
INNER JOIN Article b
ON b.ArtikelCeId = acteP.VervangenDoorArtikelCEId
/*find childs */
UNION ALL
SELECT c.ArtikelCEId, c.VervangenDoorArtikelCEId
FROM ArtikelCE_CTE acteC
INNER JOIN Article c
ON c.VervangenDoorArtikelCEId = acteC.ArtikelCeId
where c.VervangenDoorArtikelCEId is not null
)
SELECT ArtikelCeId, VervangenDoorArtikelCEId FROM ArtikelCE_CTE