Рекурсивное выражение CTE в SQL Server 2005, которое обновляет иерархические данные
WITH HCustomersCTE (Id, ParentId, _
 Name, Level)
AS
(
 — Определение якорного члена 
 SELECT C.Id, C.ParentId, C.Name, _
 0 AS Level
 FROM Customers C
 WHERE ParentId IS NULL
 UNION ALL
 — Определение рекурсивного члена 
 SELECT ChildC.Id, ChildC.ParentId, _
 ChildC.Name, Level + 1
 FROM Customers ChildC
 INNER JOIN HCustomersCTE _
 ParentC ON (ParentC.Id = _
 ChildC.ParentId)
)
— Применение CTE для обновления записей на базе рекурсивного запроса 
UPDATE C
 SET HierarchyLevel = CTE.Level
 FROM Customers C,
 HCustomersCTE CTE
 WHERE C.Id = CTE.Id

Поделитесь материалом с коллегами и друзьями