2013-10-25 13 views
17

Mam następujące zapytanie:SQL UPDATE TOP z ORDER BY?

UPDATE TOP (@MaxRecords) Messages 
SET status = 'P' 
OUTPUT inserted.* 
FROM Messages 
where Status = 'N' 
and InsertDate >= GETDATE() 

W tabeli Komunikaty istnieje kolumna priorytetem i chcę pierwszy seleci wysokie wiadomości priorytetowych. Więc potrzebuję ORDER BY. Ale nie muszę sortować danych wyjściowych, ale sortować dane przed uruchomieniem aktualizacji.

O ile mi wiadomo, nie można dodać instrukcji ORDER BY do instrukcji UPDATE. Jakieś inne pomysły?

m.

+1

Prawdopodobny duplikat zapytania [zapytanie o aktualizację SQL pierwszego wiersza] (http://stackoverflow.com/questions/3860975/sql-update-top1-row-query) – fabriciorissetto

+0

Możliwy duplikat [Jak zaktualizować i zamówić za pomocą ms sql ] (http://stackoverflow.com/questions/655010/how-to-update-and-order-by-using-ms-sql) – Athafoud

Odpowiedz

27

można użyć wyrażenia tabelowego za to:

;with cte as (
    select top (@MaxRecords) 
     status 
    from Messages 
    where Status = 'N' and InsertDate >= getdate() 
    order by ... 
) 
update cte set 
    status = 'P' 
output inserted.* 

Ten używa Fakt, że w SQL Server można aktualizować cte, podobnie jak widok aktualizowalny.

-6

poprawna składnia aktualizacji jest

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
[WHERE where_condition] 
[ORDER BY ...] 
[LIMIT row_count] 
+0

Nie na serwerze Sql. – mark

12

Można spróbować kwerendy sub jak

UPDATE Messages 
    SET status = 'P' 
    WHERE MessageId IN (SELECT TOP (@MaxRecords) MessageId FROM Messages where Status = 'N' and InsertDate >= GETDATE() ORDER BY Priority) 
output inserted.* 
+0

W moim przypadku nie korzystałem z TOP, ponieważ chciałem zaktualizować wszystkie dopasowane rekordy według klauzuli WHERE i otrzymałem komunikat o błędzie: "Klauzula ORDER BY jest niepoprawna w widokach, funkcjach wbudowanych, tabelach pochodnych, podzapytaniach i typowych wyrażeniach tabel. , chyba że określono również TOP, OFFSET lub FOR XML. " Dodanie manekina TOP (100000) sprawi, że zadziała. Nie wiem, czy w moim przypadku jest lepsze rozwiązanie. –

+2

@AugustoBarreto można użyć 'top 100 procent', aby pobrać wszystkie rekordy zamiast liczby fikcyjnej. – Athafoud

+0

Dzięki! Nie wiedziałem o tym. Czytanie dokumentów: "Ogranicza wiersze zwrócone w wyniku zapytania do określonej liczby wierszy lub procent wierszy" –