Antworten:
Beachten Sie, dass die Klammern für UPDATE-Anweisungen erforderlich sind:
update top (100) table1 set field1 = 1
Ohne eine macht ORDER BY
die ganze Idee von TOP
nicht viel Sinn. Sie müssen eine konsistente Definition haben, welche Richtung "oben" und welche "unten" ist, damit das Konzept von oben sinnvoll ist.
SQL Server erlaubt dies, garantiert jedoch kein deterministisches Ergebnis .
Die UPDATE TOP
Syntax in der akzeptierten Antwort unterstützt keine ORDER BY
Klausel, aber es ist möglich, hier eine deterministische Semantik zu erhalten, indem ein CTE oder eine abgeleitete Tabelle verwendet wird, um die gewünschte Sortierreihenfolge wie folgt zu definieren.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
Gewinnchancen verwenden, Sie es verwenden sollten, ORDER BY
weil das, woran Sie interessiert sind, das "Meiste" oder "Wenigste" von etwas ist. In anderen Fällen sind Sie möglicherweise nur an einem passenden Datensatz interessiert. Wie ich heute! Ich musste Datenprobleme (Zyklen) einzeln beheben. Der gesamte Fixierungsprozess umfasste ein DB-Skript, einige Benutzereingriffe und einige Anwendungsvorgänge. Es war uns egal, welcher Datensatz zuerst bearbeitet wurde. Wir haben uns nur darum gekümmert, dass wir sie einzeln behandeln.
WHERE
Klausel gehabt , um zuvor verarbeitete Datensätze auszuschließen. Die Frage als schriftliche und akzeptierte Antwort ist ziemlich bedeutungslos. Übrigens: Für die Verwendung von Tabellen als Warteschlange ist dies ein nützlicher Link
where
Klausel, um zu vermeiden, dass dieselben Zeilen immer wieder verarbeitet werden.
für diejenigen wie mich, die immer noch mit SQL Server 2000 stecken, SET ROWCOUNT {number};
kann vor der UPDATE
Abfrage verwendet werden
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
begrenzt das Update auf 100 Zeilen
Es ist mindestens seit SQL 2005 veraltet, aber ab SQL 2017 funktioniert es immer noch. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Was noch cooler ist, ist die Tatsache, dass Sie eine Inline-Tabellenwertfunktion verwenden können, um auszuwählen, welche (und wie viele Via TOP
) Zeilen aktualisiert werden sollen. Das ist:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Für die Tabellenwertfunktion haben Sie etwas Interessantes, um die zu aktualisierende Zeile auszuwählen, wie:
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
)
... und da liegt (meiner bescheidenen Meinung nach) die wahre Kraft, nur die oben ausgewählten Zeilen deterministisch zu aktualisieren und gleichzeitig die Syntax der UPDATE
Anweisung zu vereinfachen .
Versuchen:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Sie können auch mithilfe von Alias aktualisieren und beitreten und beitreten:
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
auch benutzt?