Comment utiliser ROW_NUMBER () dans la clause UPDATE?

ROW_NUMBER() est uniquement utilisé dans la clause SELECT dans MS SQL Server , mais je souhaite l'utiliser pour la mise à jour comme suit:

 Update MyTab Set MyNo = 123 + ROW_NUMBER() over (Order By ID) Where a=b; 

alors j'ai eu Erreur comme,

Les fonctions fenêtrées ne peuvent apparaître que dans les clauses SELECT ou ORDER BY.

Comment utiliser ROW_NUMBER() dans la clause UPDATE ?

 DECLARE @MyTable TABLE ( ID INT IDENTITY(2,2) PRIMARY KEY, MyNum INT, ColA INT, ColB INT ); INSERT @MyTable (ColA, ColB) SELECT 11, 11 UNION ALL SELECT 22, 22 UNION ALL SELECT NULL, NULL UNION ALL SELECT 33, NULL UNION ALL SELECT NULL, 44 UNION ALL SELECT 55, 66; UPDATE UpdateTarget SET MyNum = RowNum FROM ( SELECT x.MyNum, ROW_NUMBER() OVER(ORDER BY x.ID) AS RowNum FROM @MyTable x WHERE x.ColA = x.ColB ) AS UpdateTarget; SELECT * FROM @MyTable; 

Résultats:

 ID MyNum ColA ColB ----------- ----------- ----------- ----------- 2 1 11 11 4 2 22 22 6 NULL NULL NULL 8 NULL 33 NULL 10 NULL NULL 44 12 NULL 55 66 

Vous pouvez utiliser un CTE:

 ;WITH RowNbrs AS ( SELECT ID , ROW_NUMBER() OVER (ORDER BY ID) AS RowNbr FROM MyTab WHERE a = b ) UPDATE t SET t.MyNo = 123 + r.RowNbr FROM MyTab t JOIN RowNbrs r ON t.ID = r.ID; 

J'utiliserais un CTE

 WITH myUpdate ( myRowNumber ) AS ( SELECT ROW_NUMBER() over (order by ID) As myRowNumber FROM MyTab WHERE a = b ) update MyTab set MyNo = 123 + myRowNumber FROM myUpdate 

Vous pouvez le tester d'abord en faisant un

 select * from myUpdate