Рекурсивное выражение 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