2010-12-01 18 views
3

Je me demande s'il existe une mise à jour récurrente dans tsql (CTE)TSQL Une mise à jour récursive?

ID parentID value 
-- -------- ----- 
1 NULL  0 
2 1  0 
3 2  0 
4 3  0 
5 4  0 
6 5  0 

Je permet de mettre à jour la colonne value récursive en utilisant CTE d'ID par exemple 6 = au sommet le plus rangée?

+0

Qu'est-ce que vous voulez mettre à jour avec? est une boucle procedureal ok? ou est l'exigence tout dans une seule déclaration de mise à jour? – Randy

+0

J'ai fait une erreur, relire la dernière phrase – Tony

Répondre

8

Oui, ça devrait l'être. MSDN gives an example:

USE AdventureWorks; 
GO 
WITH DirectReports(EmployeeID, NewVacationHours, EmployeeLevel) 
AS 
(SELECT e.EmployeeID, e.VacationHours, 1 
    FROM HumanResources.Employee AS e 
    WHERE e.ManagerID = 12 
    UNION ALL 
    SELECT e.EmployeeID, e.VacationHours, EmployeeLevel + 1 
    FROM HumanResources.Employee as e 
    JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID 
) 
UPDATE HumanResources.Employee 
SET VacationHours = VacationHours * 1.25 
FROM HumanResources.Employee AS e 
JOIN DirectReports AS d ON e.EmployeeID = d.EmployeeID; 
+0

Le CTE lui-même ne peut pas être mis à jour. Cela donne l'erreur 'Table dérivée 'DirectReports' n'est pas modifiable parce qu'une colonne de la table dérivée est dérivée ou constante.' –

+0

geez, bien sûr ... nous pouvons joindre la table CTE dans la requête de mise à jour, qui résout tous mes problèmes ... Je Vous dois une bière, homme;) merci! – Tony

+3

@Tony - ne dérange pas. Ce sera tout à fait suffisant si vous acceptez ma réponse et que je me réfère désormais à "Votre Majesté". :) –