web-dev-qa-db-fra.com

Comment ajouter une colonne de ligne dans SQL Server 2012

J'essaie d'ajouter une nouvelle colonne à une table existante, où la valeur est le numéro/rang de la ligne. J'ai besoin d'un moyen de générer le numéro de rang/valeur de rang, et j'ai également besoin de limiter les rangées affectées - dans ce cas, la présence d'une sous-chaîne dans une chaîne.

En ce moment j'ai:

UPDATE table
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table
WHERE CHARINDEX('2009',col2) > 0

Et je reçois cette erreur:

Windowed functions can only appear in the SELECT or ORDER BY clauses.

(Même erreur pour RANK())

Est-il possible de créer/mettre à jour une colonne avec la fonction ROW_NUMBER ()? Pour votre information, ceci est destiné à remplacer une colonne "rang" incorrecte, déjà existante.

15
Michael Carper

Vous pouvez le faire avec un CTE, quelque chose comme:

with cte as
(
  select *
    , new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc)
  from MyTable
  where charindex('2009',col2) > 0
)
update cte
set row_id = new_row_id

SQL Fiddle avec démo .

24
Ian Preston

Si vous ne mettez à jour que quelques milliers de lignes, vous pouvez essayer quelque chose comme ceci:

select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar)
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry 
where SomeClause and SomeOtherClause
) tbl

Copiez et collez les résultats de la requête dans l'éditeur de requête et exécutez-les. C'est un peu lent et yukky ça marche.

1
Sparhawk_