我需要在 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

10-08 19:47