TOP (Transact-SQL)

Gibt an, dass nur der erste Satz Zeilen aus dem Abfrageergebnis zurückgegeben wird. Bei dem Satz Zeilen kann es sich um eine Anzahl oder einen Prozentsatz der Zeilen handeln. Der TOP-Ausdruck kann in SELECT-, INSERT-, UPDATE-, MERGE- und DELETE-Anweisungen verwendet werden.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

[ 
     TOP (expression) [PERCENT]
     [ WITH TIES ]
]

Argumente

  • expression
    Der numerische Ausdruck, der angibt, dass eine Anzahl von Zeilen zurückgegeben wird. expression wird implizit in einen float-Wert konvertiert, wenn PERCENT angegeben ist. Andernfalls wird der Ausdruck in bigint konvertiert.

    Klammern zur Begrenzung von expression in TOP sind in INSERT-, UPDATE- und DELETE-Anweisungen erforderlich. Zum Sicherstellen der Abwärtskompatibilität wird die Verwendung von TOP expression ohne Klammern in SELECT-Anweisungen unterstützt, jedoch nicht empfohlen.

    Wenn die Abfrage eine ORDER BY-Klausel enthält, werden die ersten expression Zeilen (oder expression Prozent der Zeilen) der von der ORDER BY-Klausel sortierten Zeilen zurückgegeben. Falls die Abfrage keine ORDER BY-Klausel enthält, ist die Reihenfolge der Zeilen beliebig.

  • PERCENT
    Gibt an, dass die Abfrage nur die ersten expression Prozent der Zeilen aus dem Resultset zurückgibt.

  • WITH TIES
    Gibt an, dass weitere Zeilen vom Basisresultset mit den gleichen Werten in den ORDER BY-Spalten zurückgegeben werden sollen wie in den letzten der TOP n (PERCENT) Zeilen. TOP...WITH TIES kann nur in SELECT-Anweisungen angegeben werden und nur dann, wenn eine ORDER BY-Klausel angegeben wurde.

    HinweisHinweis

    Die zurückgegebene Reihenfolge beim Binden von Datensätzen ist beliebig. ORDER BY wirkt sich nicht auf diese Regel aus.

Hinweise

TOP kann nicht zusammen mit UPDATE- und DELETE-Anweisungen für partitionierte Sichten verwendet werden.

Die Zeilen, auf die im TOP-Ausdruck verwiesen wird, die mit INSERT, UPDATE, MERGE oder DELETE verwendet werden, sind nicht in einer bestimmten Reihenfolge angeordnet. TOP n gibt n zufällige Zeilen zurück. Die folgende INSERT-Anweisung enthält beispielsweise die ORDER BY-Klausel, diese wirkt sich jedoch nicht auf die Zeilen aus, auf die von der INSERT-Anweisung direkt verwiesen wird.

INSERT TOP (2) INTO Table2 (ColumnB) 
    SELECT ColumnA FROM Table1 
    ORDER BY ColumnA;

Die ORDER BY-Klausel in der vorherigen Abfrage verweist nur auf die Zeilen, die von der geschachtelten SELECT-Anweisung zurückgegeben werden. Die INSERT-Anweisung wählt zwei beliebige Zeilen aus, die von der SELECT-Anweisung zurückgegeben werden. Um sicherzustellen, dass die beiden obersten Zeilen aus der SELECT-Unterabfrage eingefügt werden, schreiben Sie die Abfrage wie folgt neu.

INSERT INTO Table2 (ColumnB) 
    SELECT TOP (2) ColumnA FROM Table1 
    ORDER BY ColumnA;

SQL Server ermöglicht das Aktualisieren von Sichten, die mit der TOP-Klausel erstellt wurden. Da die TOP-Klausel in der Sichtdefinition enthalten ist, können bestimmte Zeilen bei einer Aktualisierung u. U. verschwinden, falls das Ergebnis nicht länger die Anforderungen des TOP-Ausdrucks erfüllt. Weitere Informationen finden Sie unter Ändern von Daten über eine Sicht.

Der TOP-Ausdruck in einer Abfrage wirkt sich nicht auf Anweisungen aus, die möglicherweise wegen eines ausgelösten Triggers ausgeführt werden. Die eingefügten und aktualisierten Tabellen in den Triggern zeigen nur die Zeilen an, die von den INSERT-, UPDATE-, MERGE- oder DELETE-Anweisungen tatsächlich betroffen sind.

Verwenden von TOP in der MERGE-Anweisung

Wenn eine TOP-Klausel in der MERGE-Anweisung angegeben wird, wird die TOP-Klausel nach dem Verbinden der gesamten Quelltabelle und der gesamten Zieltabelle angewendet, wenn die verbundenen Zeilen entfernt wurden, die für einen Einfüge-, Aktualisierungs- oder Löschvorgang nicht in Betracht kommen. Die TOP-Klausel verringert zudem die Anzahl der verknüpften Zeilen auf den angegebenen Wert, und die INSERT-, UPDATE- oder DELETE-Aktionen werden ungeordnet auf die verbliebenen verknüpften Zeilen angewendet. Das heißt, für die Verteilung der Zeilen auf die in den WHEN-Klauseln definierten Aktionen gilt keine bestimmte Reihenfolge. Wenn beispielsweise TOP (10) angegeben wird, sind 10 Zeilen betroffen. Von diesen Zeilen können 7 aktualisiert und 3 eingefügt werden, oder 1 Zeile kann gelöscht, 5 können aktualisiert und 4 eingefügt werden usw.

Da die MERGE-Anweisung einen vollständigen Tabellenscan der Quell- und der Zieltabelle ausführt, kann die E/A-Leistung beeinträchtigt werden, wenn mit der TOP-Klausel eine große Tabelle durch Erstellen mehrerer Batches geändert wird. In diesem Szenario muss unbedingt sichergestellt werden, dass alle aufeinander folgenden Batches auf neue Zeilen zeigen. Weitere Informationen finden Sie unter Optimieren der Leistung bei MERGE-Anweisungen.

Beispiele

A. Verwenden von TOP mit Variablen

Im folgenden Beispiel wird eine Variable verwendet, um die ersten 10 Mitarbeiter abzurufen, die in der dbo.Employee-Tabelle der AdventureWorks-Datenbank aufgelistet sind.

USE AdventureWorks;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO

B. Verwenden von TOP mit PERCENT und WITH TIES

Im folgenden Beispiel werden die obersten 10 Prozent aller Mitarbeiter mit dem höchsten Gehalt abgerufen und in absteigender Reihenfolge nach der Höhe des Grundgehalts zurückgegeben. Durch Angeben von WITH TIES wird sichergestellt, dass alle Mitarbeiter mit einem Gehalt, das dem niedrigsten zurückgegebenen Gehalt entspricht, ebenfalls im Resultset enthalten sind, auch wenn dadurch 10 Prozent der Mitarbeiter überschritten werden.

USE AdventureWorks;
GO
SELECT TOP(10) PERCENT WITH TIES
c.FirstName, c.LastName, e.Title, e.Gender, r.Rate
FROM Person.Contact AS c 
    INNER JOIN HumanResources.Employee AS e
        ON c.ContactID = e.ContactID
    INNER JOIN HumanResources.EmployeePayHistory AS r
        ON r.EmployeeID = e.EmployeeID
ORDER BY Rate DESC;