2009-09-28 32 views
8

Ho bisogno di aggiornare le prime N righe in una tabella che soddisfa una condizione.Come aggiornare n righe in una tabella?

So che posso fare un aggiornamento in alto N ... ma il problema è che N è in una variabile @.

UPDATE TOP @N SET ... non funziona.

C'è un modo per farlo che mi manca?

Nessuna definizione di tabella specifica qui perché non ha importanza quali sono le colonne. Se riesco a farlo per una tabella di una colonna, posso farlo per la mia tabella.

risposta

16

è necessario utilizzare parentesi dopo TOP clausola quando si vuole utilizzare una variabile:

UPDATE TOP(@N) ... 
+0

Fantastico trucco! Grazie per avermelo insegnato. È interessante notare che questa stessa sintassi non funziona con il costrutto "SELECT TOP n". Posso perché questo succederebbe, anche se è piuttosto una strana asimmetria in TSQL. – mjv

+0

'SELECT TOP n' funziona solo se' n' è una costante, non una variabile. Ha funzionato in questo modo prima del 2005. 'TOP' con un argomento variabile e' TOP' per le istruzioni DML è stato aggiunto dal 2005 e richiede parenti. –

+0

Questo sarebbe davvero interessante, tuttavia, "update top (@N) set systemuserid = @ID dove systemuserid è null" mi dà "sintassi errata vicino alla parola chiave 'set'". – Moose

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

UPDATE TOP (@r) funzionerà ma sarà aggiornare le righe @rin nessun ordine particolare.

Dal documentation:

Le righe riferimento nella TOP espressione utilizzati con INSERT, UPDATE o DELETE non sono disposti in qualsiasi ordine. TOP n restituisce n righe casuali.

+0

'@ KM': questa volta ho corretto l'istruzione * prima * che hai indicato :) – Quassnoi

+0

+1, ho sentito di imparare, quindi provo molto codice, non ho mai visto un UPDATE di un CTE, lo farò devo giocare un po 'con questo ... –

+0

'@ KM': molto utile per eliminare i duplicati. http://explainextended.com/2009/03/14/deleting-duplicates/ – Quassnoi

Problemi correlati