it-swarm.com.de

wie kann ich die Top 100 Datensätze in SQL Server aktualisieren?

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?

338
Rajesh

Beachten Sie, dass die Klammern für UPDATE-Anweisungen erforderlich sind:

update top (100) table1 set field1 = 1
589
Umair Ahmed

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'
276
Martin Smith

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

14
Claudio B
update tb set  f1=1 where id in (select top 100 id from tb where f1=0)
9
hyyxing

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.

4

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
0
Vanderlei Pires

Versuchen:

UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo 
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY 
CreatedDate DESC)