Je souhaite mettre à jour ma colonne CODE_DEST avec un numéro incrémentiel. J'ai:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Je voudrais le mettre à jour pour qu'il soit:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
J'ai essayé ce code:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Cela ne fonctionne pas à cause du )
J'ai également essayé:
WITH DESTINATAIRE_TEMP AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN
Mais cela ne fonctionne pas non plus à cause de l'union.
Comment puis-je mettre à jour une colonne à l'aide de la ROW_NUMBER()
fonction dans SQL Server 2008 R2?
sql-server
sql-server-2008-r2
sql-update
user609511
la source
la source
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Réponses:
Une autre option
la source
essaye ça
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
la source
SET CODE_DEST = @id, @id = @id + 1
pour la lisibilité.la source
Votre deuxième tentative a échoué principalement parce que vous avez nommé le CTE de la même manière que la table sous-jacente et que le CTE a l'air d'être un CTE récursif , car il s'est essentiellement référé à lui-même. Un CTE récursif doit avoir une structure spécifique qui nécessite l'utilisation de l'
UNION ALL
opérateur set.Au lieu de cela, vous auriez pu simplement donner un nom différent au CTE et y ajouter la colonne cible:
la source
Ceci est une version modifiée de la réponse de @Aleksandr Fedorenko ajoutant une clause WHERE:
En ajoutant une clause WHERE, j'ai trouvé que les performances se sont considérablement améliorées pour les mises à jour ultérieures. Sql Server semble mettre à jour la ligne même si la valeur existe déjà et que cela prend du temps, donc l'ajout de la clause where fait simplement sauter les lignes où la valeur n'a pas changé. Je dois dire que j'ai été étonné de la vitesse à laquelle il pouvait exécuter ma requête.
Clause de non-responsabilité: je ne suis pas un expert de la base de données et j'utilise PARTITION BY pour ma clause, il se peut donc que les résultats ne soient pas exactement les mêmes pour cette requête. Pour moi, la colonne en question est la commande payée d'un client, donc la valeur ne change généralement pas une fois qu'elle est définie.
Assurez-vous également que vous avez des index, en particulier si vous avez une clause WHERE sur l'instruction SELECT. Un index filtré fonctionnait très bien pour moi car je filtrais en fonction des statuts de paiement.
Ma requête utilisant PARTITION par
La partie 'IS NOT NULL' n'est pas requise si la colonne n'est pas NULL.
Quand je dis que l'augmentation des performances était massive, je veux dire qu'elle était essentiellement instantanée lors de la mise à jour d'un petit nombre de lignes. Avec les bons index, j'ai pu réaliser une mise à jour qui a pris le même temps que la requête `` interne '' elle-même:
la source
J'ai fait ça pour ma situation et j'ai travaillé
la source
Un moyen simple et facile de mettre à jour le curseur
la source
Si la table n'a pas de relation, copiez simplement tout dans la nouvelle table avec le numéro de ligne et supprimez l'ancienne et renommez la nouvelle avec l'ancienne.
la source