Odpowiedzi:
Uwaga: w instrukcjach UPDATE wymagane są nawiasy:
update top (100) table1 set field1 = 1
Bez ORDER BY
całej idei TOP
nie ma większego sensu. Musisz mieć spójną definicję tego, który kierunek jest „w górę”, a który „w dół”, aby koncepcja góry była znacząca.
Niemniej jednak SQL Server pozwala na to, ale nie gwarantuje wyniku deterministycznego .
UPDATE TOP
Składnia w przyjętym odpowiedź nie obsługuje ORDER BY
klauzuli, ale jest możliwe, aby uzyskać deterministyczne semantyki tutaj przy użyciu CTE lub tabelę pochodzącą zdefiniować pożądany porządek jak poniżej.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
kursów, powinieneś z nich korzystać, ORDER BY
ponieważ to, co Cię interesuje, jest jak „najbardziej” lub „najmniej” czegoś. W innych przypadkach możesz być zainteresowany uzyskaniem tylko jednego pasującego rekordu. Polub mnie dzisiaj! Musiałem naprawiać problemy z danymi (cyklami) pojedynczo. Cały proces naprawy obejmował skrypt db, interwencję użytkownika i niektóre operacje aplikacji. Nie obchodziło nas, który rekord został obsłużony jako pierwszy. Troszczyliśmy się tylko o to, abyśmy sobie z nimi radzili pojedynczo.
WHERE
klauzulę wykluczającą wcześniej przetworzone rekordy. Pytanie w formie pisemnej i zaakceptowanej nie ma żadnego znaczenia. BTW: Do używania tabel jako kolejki jest to dość przydatne łącze
where
klauzuli, aby uniknąć ponownego przetwarzania tych samych wierszy.
dla takich jak ja nadal utknąłem z SQL Server 2000, SET ROWCOUNT {number};
można użyć przed UPDATE
zapytaniem
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
ograniczy aktualizację do 100 wierszy
Jest przestarzałe przynajmniej od SQL 2005, ale od SQL 2017 nadal działa. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Co jeszcze fajniejsze, to fakt, że możesz użyć wbudowanej funkcji wycenianej w tabeli, aby wybrać, które (i ile poprzez TOP
) wierszy chcesz zaktualizować. To jest:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Dla funkcji wycenianej w tabeli masz coś interesującego, aby wybrać wiersz do aktualizacji, np .:
CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
@Param1 INT,
@Param2 INT,
@Param3 INT
)
RETURNS TABLE AS RETURN
(
SELECT TOP(1) MyTable.*
FROM MyTable
JOIN MyOtherTable
ON ...
JOIN WhoKnowsWhatElse
ON ...
WHERE MyTable.SomeColumn=@Param1 AND ...
ORDER BY MyTable.SomeDate DESC
)
... i leży (moim skromnym zdaniem) prawdziwa moc aktualizowania tylko wybranych wybranych wierszy deterministycznie, przy jednoczesnym uproszczeniu składni UPDATE
instrukcji.
Próbować:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Możesz także zaktualizować z wyboru za pomocą aliasu i dołączyć:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
order by
?