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