2009-09-28 9 views
8

J'ai besoin de mettre à jour les N premières lignes d'une table rencontrant une condition.Comment mettre à jour n lignes d'une table?

Je sais que je peux faire un Update Top N ... mais le problème est que N est dans une @ variable.

MISE À JOUR TOP @N SET ... ne fonctionne pas.

Existe-t-il un moyen de le faire que je manque?

Aucune définition de table spécifique ici car peu importe les colonnes. Si je peux le faire pour une table à une colonne, je peux le faire pour ma table.

Répondre

16

Vous devez utiliser parens après TOP clause lorsque vous souhaitez utiliser une variable:

UPDATE TOP(@N) ... 
+0

Truc sympa! Merci de m'avoir appris ça. Fait intéressant, cette syntaxe ne fonctionne pas avec la construction 'SELECT TOP n'. Je peux pourquoi cela se produirait, bien qu'il s'agisse d'une asymétrie quelque peu étrange dans TSQL. – mjv

+0

'SELECT TOP n' ne fonctionne que si' n' est une constante, pas une variable. Cela a fonctionné comme ça avant 2005. 'TOP' avec un argument variable et' TOP' pour les instructions DML a été ajouté depuis 2005 et nécessite des parens. –

+0

Cela serait vraiment cool, cependant, "mise à jour top (@N) set systemuserid = @ID où systemuserid est null" me donne "Syntaxe incorrecte près du mot clé 'set'". – Moose

10
WITH q AS 
     (
     SELECT TOP (@r) * 
     FROM mytable 
     ORDER BY 
       col1 
     ) 
UPDATE q 
SET  co12 = @value 

UPDATE TOP (@r) fonctionnera, mais il mettra à jour toutes les @r lignes sans ordre particulier.

documentation

De l':

Les lignes référencées dans l'expression TOPINSERT utilisés avec, UPDATE ou DELETE ne sont pas disposées dans un ordre quelconque. TOP n renvoie n lignes aléatoires.

+0

'@ KM': cette fois j'ai corrigé la déclaration * avant * vous avez pointé :) – Quassnoi

+0

+1, j'entends apprendre, donc j'essaie beaucoup de code, je n'ai jamais vu une mise à jour d'un CTE, je vais avoir à jouer avec un peu ... –

+0

'@ KM': très utile pour supprimer les doublons. http://explainextended.com/2009/03/14/deleting-duplicates/ – Quassnoi

Questions connexes