2009-09-28 10 views
8

Muszę zaktualizować pierwsze N ​​wierszy tabeli spełniającej warunek.Jak zaktualizować n wierszy w tabeli?

Wiem, że mogę zrobić Update Top N ... ale problem polega na tym, że N jest w zmiennej @.

UPDATE TOP @N SET ... nie działa.

Czy istnieje sposób, aby to zrobić, czego właśnie brakuje?

Brak tutaj określonych definicji tabel, ponieważ nie ma znaczenia, jakie są kolumny. Jeśli mogę to zrobić dla tabeli z jedną kolumną, mogę zrobić to dla mojej tabeli.

Odpowiedz

16

Trzeba użyć nawiasów po TOP klauzuli, gdy chcesz użyć zmiennej:

UPDATE TOP(@N) ... 
+0

Fajna sztuczka! Dzięki za nauczenie mnie. Co ciekawe, ta sama składnia nie działa z konstrukcją "SELECT TOP n". Mogę, dlaczego tak się stanie, chociaż jest to nieco dziwna asymetria w TSQL. – mjv

+0

'SELECT TOP n' działa tylko wtedy, gdy' n' jest stałą, a nie zmienną. Tak działało przed rokiem 2005. "TOP" ze zmienną argumentacją i 'TOP' dla instrukcji DML został dodany od 2005 roku i wymaga parens. –

+0

Byłoby to jednak naprawdę fajne, "update top (@N) ustaw modułserser = @ID, gdzie pozycjaserser ma wartość null" daje mi "Niepoprawna składnia w pobliżu słowa kluczowego" zestaw "". – Moose

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

UPDATE TOP (@r) będzie działać, ale będzie zaktualizować dowolną @r wierszy więcej w przypadkowej kolejności.

Z documentation:

Rzędy użyte w ekspresji TOP stosować INSERT, UPDATE lub DELETE nie są umieszczone w dowolnej kolejności. TOP n zwraca n losowych wierszy.

+0

'@ KM': tym razem poprawiłem oświadczenie * przed * wskazałeś :) – Quassnoi

+0

+1, słyszę, aby się uczyć, więc wypróbowałem dużo kodu, nigdy nie widziałem aktualizacji CTE, będę musicie grać z tym trochę ... –

+0

'@ KM': bardzo przydatny do usuwania duplikatów. http://explainextended.com/2009/03/14/deleting-duplicates/ – Quassnoi

Powiązane problemy