SQL de mise à Jour avec la fonction row_number()
Je veux 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 à:
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 en raison de la )
J'ai aussi 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 à cause de l'union.
Comment puis-je mettre à jour une colonne à l'aide de la ROW_NUMBER()
fonction dans SQL Server 2008 R2?
- Post données de l'échantillon et les résultats attendus, c'est la meilleure façon d'obtenir SQL réponse avec. Sinon, votre ? n'a pas de sens et donner des réponses comme ça
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Vous devez vous connecter pour publier un commentaire.
Une option de plus
essayer cette
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
SET CODE_DEST = @id, @id = @id + 1
pour des raisons de lisibilité.Votre deuxième tentative a échoué, principalement parce que vous avez nommé le CTE de même que la table sous-jacente et fait la CTE regarder comme si elle était un expression de table commune récursive, car il est essentiellement référencés lui-même. Un expression de table commune récursive doit avoir une structure spécifique qui nécessite l'utilisation de l'
UNION ALL
opérateur d'ensemble.Au lieu de cela, vous pourriez juste avoir donné la CTE un autre nom, ainsi que l'ajout de la colonne cible: les
Ceci est une version modifiée de @Alexandre Fedorenko la réponse de l'ajout d'une clause where:
Par l'ajout d'une clause where, j'ai trouvé la performance améliorée massivement pour les mises à jour ultérieures. Sql Server semble mise à jour de la suite, même si la valeur existe déjà et il faut du temps pour le faire, donc, l'ajout de la clause where en fait il suffit de sauter sur des lignes où la valeur n'a pas changé. Je dois dire que j'ai été étonné de voir à quelle vitesse il pourrait exécuter ma requête.
Avertissement: je ne suis pas un DB d'expert, et je suis à l'utilisation de la PARTITION pour mon clause de sorte qu'il peut ne pas être exactement les mêmes résultats pour cette requête. Pour moi, la colonne en question est un client de la commande payée, de sorte que la valeur ne change pas une fois qu'il est réglé.
Assurez-vous également que vous avez des indices, surtout si vous avez une clause where sur l'instruction SELECT. Un index filtré beaucoup travaillé pour moi comme je l'ai été filtrage basé sur le paiement des statuts.
Ma requête à l'aide de la PARTITION par
L' "n'EST PAS NULL', la partie n'est pas nécessaire si la colonne n'est pas les valeurs null.
Quand je dis que l'augmentation de la performance a été énorme, je veux dire que c'était essentiellement instantané lors de la mise à jour d'un petit nombre de lignes. Avec le droit de l'index j'ai été en mesure de parvenir à une mise à jour qui a eu la même quantité de temps que le "intérieure" de la requête n'a par lui-même:
Simple et facile à mettre à jour le curseur
Je l'ai fait pour ma situation et a travaillé
Si le tableau n'a pas la relation, il suffit de copier le tout dans le nouveau tableau avec le numéro de ligne et de supprimer les vieux et renommer le nouveau avec du vieux.
Sélectionnez RowNum = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) , * DANS le mdp.dbo.SALES2018 de
(
sélectionnez * à partir de SALE2018) comme SalesSource