我需要在 SQL Server 2008 中创建一个存储过程,它将根据某个值更新一个表。这里的技巧是我需要递归搜索表,直到找到我要查找的值,然后更新当前记录。例如,我有一个包含 3 列的员工表:
员工ID
经理 ID
家庭 ID
对于表中的每个 EmployeeId,我想获取其 ManagerId。然后,如果 ManagerID != 0,去获取当前 ManagerId 的 ManagerId(每个 ManagerId 将指向一个 EmployeeId)——继续这个直到我到达顶级经理(其中 ManagerId == 0)。
找到顶级经理后,我想使用上述流程的最后一个 EmployeeId 的值更新启动流程的原始记录中的 FamilyId 列。
基本上我需要对表中的每条记录执行此操作。我正在尝试将 FamilyId 设置为层次结构中所有员工和经理的根经理的值。
我不确定是否应该使用游标或 CTE 来完成这项工作——或者只是在代码中完成。
任何帮助是极大的赞赏。
谢谢!
最佳答案
您也可以使用递归 CTE。
;WITH Hierarchy
As (SELECT EmployeeId AS _EmployeeId,
ManagerId AS _ManagerId,
EmployeeId AS _FamilyId
FROM @Employee
WHERE ManagerId = 0
UNION ALL
SELECT e.EmployeeId,
e.ManagerId,
h._FamilyId
FROM @Employee e
JOIN Hierarchy h
ON h._EmployeeId = e.ManagerId)
UPDATE @Employee
SET FamilyId = _FamilyId
FROM Hierarchy h
WHERE EmployeeId = _EmployeeId