Ich möchte die ersten 100 Datensätze in SQL Server aktualisieren. Ich habe eine Tabelle T1
mit den Feldern F1
und F2
. T1
hat 200 Datensätze. Ich möchte das F1
-Feld in den Top-100-Datensätzen aktualisieren. Wie kann ich basierend auf TOP 100
in SQL Server aktualisieren?
Beachten Sie, dass die Klammern für UPDATE-Anweisungen erforderlich sind:
update top (100) table1 set field1 = 1
Ohne ORDER BY
macht die ganze Idee von TOP
keinen Sinn. Sie müssen eine konsistente Definition haben, welche Richtung "nach oben" und welche "nach unten" ist, damit das Konzept von top sinnvoll ist.
Trotzdem erlaubt es SQL Server, aber garantiert kein deterministisches Ergebnis .
Die UPDATE TOP
-Syntax in der akzeptierten Antwort unterstützt keine ORDER BY
-Klausel, es ist jedoch möglich, hier deterministische Semantik zu erhalten, indem eine 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'
für Benutzer wie mich, die SQL Server 2000 noch nicht kennen, kann SET ROWCOUNT {number};
vor der Abfrage UPDATE
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 seit SQL 2017 funktioniert es immer noch. https://docs.Microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
Noch cooler ist die Tatsache, dass Sie eine Inline-Tabellenwertfunktion verwenden können, um auszuwählen, welche (und wie viele über TOP
) Zeilen aktualisiert werden sollen. Das ist:
UPDATE MyTable
SET [email protected]
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Für die Tabellenwertfunktion haben Sie etwas interessantes, um die zu aktualisierende Zeile auszuwählen:
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 [email protected] AND ...
ORDER BY MyTable.SomeDate DESC
)
... und da liegt (meiner bescheidenen Meinung nach) die wahre Macht, nur die oben ausgewählten Zeilen deterministisch zu aktualisieren, während gleichzeitig die Syntax der UPDATE
-Anweisung vereinfacht wird.
Sie können die Auswahl auch über Alias aktualisieren 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
Versuchen:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)