SELECT - ORDER BY-Klausel (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric

Sortiert von einer Abfrage in SQL Server zurückgegebene Daten. Verwenden Sie diese Klausel wie folgt:

  • Sortieren Sie das Resultset einer Abfrage anhand der angegebenen Spaltenliste und schränken Sie optional die für einen angegebenen Bereich zurückgegebenen Zeilen ein. Die Reihenfolge, in der Zeilen in einem Resultset zurückgegeben werden, ist nicht garantiert, es sei denn, eine ORDER BY-Klausel wird angegeben.

  • Bestimmen Sie die Reihenfolge, in der Werte der Rangfolgenfunktion auf das Resultset angewendet werden.

Transact-SQL-Syntaxkonventionen

Hinweis

ORDER BY wird in SELECT/INTO- oder CREATE TABLE AS SELECT (CTAS)-Anweisungen in Azure Synapse Analytics oder Analytics Platform System (PDW) nicht unterstützt.

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
ORDER BY order_by_expression  
    [ COLLATE collation_name ]   
    [ ASC | DESC ]   
    [ ,...n ]   
[ <offset_fetch> ]  
  
<offset_fetch> ::=  
{   
    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }  
    [  
      FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY  
    ]  
}  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
[ ORDER BY   
    {  
    order_by_expression   
    [ ASC | DESC ]   
    } [ ,...n ]   
]   

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

order_by_expression
Gibt eine Spalte oder einen Ausdruck an, anhand derer das Abfrageresultset sortiert werden soll. Eine Sortierspalte kann als Name, Spaltenalias oder eine nicht negative ganze Zahl angegeben werden, die die Position der Spalte in der Auswahlliste darstellt.

Es können mehrere Sortierspalten angegeben werden. Spaltennamen müssen eindeutig sein. Die Reihenfolge der Sortierspalten in der ORDER BY-Klausel definiert die Anordnung des sortierten Resultsets. Dies bedeutet, dass das Resultset anhand der ersten Spalte sortiert wird, und diese sortierte Liste wird anhand der zweiten Spalte sortiert usw.

Die Spaltennamen, auf die in der ORDER BY-Klausel verwiesen wird, müssen entweder einer Spalte oder einem Spaltenalias in der Auswahlliste oder einer Spalte aus einer Tabelle in der FROM-Klausel entsprechen, ohne dass dabei Zweideutigkeiten zulässig sind. Wenn die ORDER BY-Klausel auf einen Spaltenalias aus der Auswahlliste verweist, muss der Spaltenalias eigenständig und nicht als Teil eines Ausdrucks in der ORDER BY-Klausel verwendet werden, zum Beispiel folgendermaßen:

SELECT SCHEMA_NAME(schema_id) AS SchemaName FROM sys.objects 
ORDER BY SchemaName; -- correct 
SELECT SCHEMA_NAME(schema_id) AS SchemaName FROM sys.objects 
ORDER BY SchemaName + ''; -- wrong

COLLATE collation_name
Gibt an, dass der ORDER BY-Vorgang gemäß der in collation_name angegebenen Sortierung und nicht gemäß der in der Tabelle oder Sicht definierten Sortierung der Spalte ausgeführt werden soll. collation_name kann entweder der Name einer Windows-Sortierreihenfolge oder ein SQL-Sortierungsname sein. Weitere Informationen finden Sie unter Collation and Unicode Support. COLLATE ist nur für Spalten vom Typ char, varchar, nchar und nvarchar anwendbar.

ASC | DESC
Gibt an, dass die Werte in der angegebenen Spalte in aufsteigender oder absteigender Reihenfolge sortiert werden sollen. ASC sortiert vom niedrigsten Wert zum höchsten Wert. DESC sortiert vom höchsten Wert zum niedrigsten Wert. ASC ist die Standardsortierreihenfolge. NULL-Werte werden als die niedrigsten Werte behandelt, die möglich sind.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Gibt die Anzahl der Zeilen an, die übersprungen werden soll, bevor Zeilen vom Abfrageausdruck zurückgegeben werden. Der Wert kann eine ganzzahlige Konstante oder ein Ausdruck größer oder gleich 0 sein.

Gilt für: SQL Server 2012 (11.x) und höher sowie Azure SQL-Datenbank.

offset_row_count_expression kann eine Variable, ein Parameter oder eine konstante skalare Unterabfrage sein. Bei einer Unterabfrage sind keine Verweise auf Spalten möglich, die im äußeren Abfragebereich definiert wurden. Dies bedeutet, das keine Korrelation mit der äußeren Abfrage möglich ist.

ROW und ROWS sind Synonyme und werden mit ANSI-Kompatibilität bereitgestellt.

In Abfrageausführungsplänen wird der Wert für die Offsetzeilenanzahl im Offset-Attribut des TOP-Abfrageoperators angezeigt.

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Gibt die Anzahl der Zeilen an, die zurückgegeben werden sollen, nachdem die OFFSET-Klausel verarbeitet wurde. Der Wert kann eine ganzzahlige Konstante oder ein Ausdruck größer oder gleich 1 sein.

Gilt für: SQL Server 2012 (11.x) und höher sowie Azure SQL-Datenbank.

fetch_row_count_expression kann eine Variable, ein Parameter oder eine konstante skalare Unterabfrage sein. Bei einer Unterabfrage sind keine Verweise auf Spalten möglich, die im äußeren Abfragebereich definiert wurden. Dies bedeutet, das keine Korrelation mit der äußeren Abfrage möglich ist.

FIRST und NEXT sind Synonyme und werden mit ANSI-Kompatibilität bereitgestellt.

ROW und ROWS sind Synonyme und werden mit ANSI-Kompatibilität bereitgestellt.

In Abfrageausführungsplänen wird der Wert für die Offsetzeilenanzahl im Attribut Rows oder Top des TOP-Abfrageoperators angezeigt.

Bewährte Methoden

Geben Sie in der ORDER BY-Klausel keine ganzen Zahlen als Positionsangaben der Spalten in der Auswahlliste an. Auch wenn eine Anweisung wie SELECT ProductID, Name FROM Production.Production ORDER BY 2 nicht ungültig ist, wird dadurch im Vergleich zur Angabe des tatsächlichen Spaltennamens das Verständnis durch andere erschwert. Außerdem erfordern Änderungen an der Auswahlliste, etwa eine Änderung der Spaltenreihenfolge oder das Hinzufügen neuer Spalten, auch Änderungen an der ORDER BY-Klausel, um unerwartete Ergebnisse zu vermeiden.

Verwenden Sie in einer SELECT TOP (N)-Anweisung immer eine ORDER BY-Klausel. Dies ist die einzige Möglichkeit, zuverlässig anzugeben, welche Zeilen von TOP betroffen sind. Weitere Informationen finden Sie unter TOP (Transact-SQL).

Interoperabilität

Wenn sie mit einer SELECT...INTO oder INSERT...SELECT-Anweisung zum Einfügen von Zeilen aus einer anderen Quelle verwendet wird, garantiert die ORDER BY-Klausel nicht, dass die Zeilen in der angegebenen Reihenfolge eingefügt werden.

Die Verwendung von OFFSET und FETCH in einer Sicht hat keinen Einfluss auf die Updateability-Eigenschaft derselben.

Einschränkungen

Die Anzahl der Spalten in der ORDER BY-Klausel ist nicht begrenzt. Die Gesamtgröße der Spalten, die in einer ORDER BY-Klausel angegeben wurden, darf jedoch 8.060 Bytes nicht übersteigen.

Spalten vom Typ ntext, text, image, geography, geometry und xml können nicht in einer ORDER BY-Klausel verwendet werden.

Eine Ganzzahl oder Konstante kann nicht angegeben werden, wenn order_by_expression in einer Rangfolgefunktion angezeigt wird. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).

Wenn Tabellennamen in der FROM-Klausel ein Alias zugeordnet ist, können nur die Aliasnamen verwendet werden, um ihre Spalten in der ORDER BY-Klausel anzugeben.

Spaltennamen und Aliase, die in der ORDER BY-Klausel angegeben wurden, müssen in der Auswahlliste definiert werden, wenn die SELECT-Anweisung eine der folgenden Klauseln oder Operatoren enthält:

  • UNION-Operator

  • EXCEPT-Operator

  • INTERSECT-Operator

  • SELECT DISTINCT

Wenn die Anweisung einen UNION-, EXCEPT- oder INTERSECT-Operator enthält, gilt außerdem, dass die Spaltennamen oder Spaltenaliasnamen in der Auswahlliste der ersten (linken) Abfrage angegeben werden müssen.

In einer Abfrage, die die Operatoren UNION, EXCEPT oder INTERSECT verwendet, wird ORDER BY nur am Ende der Anweisung zugelassen. Diese Einschränkung ist nur gültig, wenn UNION, EXCEPT und INTERSECT in einer Abfrage der obersten Ebene verwendet werden, nicht in einer Unterabfrage. Weitere Informationen finden Sie im Abschnitt "Beispiele" weiter unten.

Die ORDER BY-Klausel ist in Sichten, Inlinefunktionen, abgeleiteten Tabellen und Unterabfragen nicht gültig, es sei denn, die TOP- oder die OFFSET- und die FETCH-Klausel werden ebenfalls angegeben. Wenn ORDER BY in diesen Objekten verwendet wird, werden mit der Klausel nur die Zeilen bestimmt, die von der TOP-Klausel oder von der OFFSET- und der FETCH-Klausel zurückgegeben werden. Durch die ORDER BY-Klausel wird keine bestimmte Ergebnisreihenfolge bei der Abfrage dieser Konstrukte sichergestellt, es sei denn, in der Abfrage selbst ist ebenfalls ORDER BY angegeben.

OFFSET und FETCH werden in indizierten Sichten oder einer Sicht, die mit der CHECK OPTION-Klausel definiert wird, nicht unterstützt.

OFFSET und FETCH können in jeder Abfrage verwendet werden, die TOP und ORDER BY zulässt. Dabei gelten folgenden Einschränkungen:

  • Die OVER-Klausel unterstützt OFFSET und FETCH nicht.

  • OFFSET und FETCH können in Anweisungen INSERT, UPDATE, MERGE, und DELETE nicht direkt angegeben werden, sondern müssen in eine entsprechende Unterabfrage eingeschlossen werden. Beispielsweise können OFFSET und FETCH in der INSERT INTO SELECT-Anweisung in die SELECT-Anweisung eingeschlossen werden.

  • In einer Abfrage, die die Operatoren UNION, EXCEPT oder INTERSECT verwendet, können OFFSET und FETCH nur in die abschließende Abfrage eingeschlossen werden, die die Reihenfolge der Abfrageergebnisse angibt.

  • TOP kann nicht mit OFFSET und FETCH im gleichen Abfrageausdruck (im gleichen Abfragebereich) kombiniert werden.

Verwenden von OFFSET und FETCH zum Einschränken der zurückgegebenen Zeilen

Es wird empfohlen, die OFFSET-Klausel und die FETCH-Klausel statt der TOP-Klausel zu verwenden, um eine Abfrageauslagerung zu implementieren und die Anzahl der an eine Clientanwendung gesendeten Zeilen einzuschränken.

Wenn Sie OFFSET und FETCH als Auslagerungslösung verwenden, muss die Abfrage einmal für jede "Seite" der Daten ausgeführt werden, die an die Clientanwendung zurückgegebenen werden. Um beispielsweise die Ergebnisse der Abfrage in Schritten von 10 Zeilen zurückzugeben, müssen Sie die Abfrage einmal ausführen, damit die Zeilen 1 bis 10 zurückgegeben werden. Wenn Sie die Abfrage erneut ausführen, werden die Zeilen 11 bis 20 zurückgegeben usw. Jede Abfrage ist unabhängig und weist keinen Bezug zur anderen auf. Dies bedeutet, dass im Gegensatz zur Verwendung eines Cursors, bei dem die Abfrage einmal ausgeführt und der Status auf dem Server beibehalten wird, die Clientanwendung für das Nachverfolgen des Status zuständig ist. Um stabile Ergebnisse zwischen Abfrageanforderungen mit OFFSET und FETCH zu erreichen, müssen die folgenden Bedingungen erfüllt werden:

  1. Die zugrunde liegenden Daten, die von der Abfrage verwendet werden, dürfen sich nicht ändern. Dies bedeutet, dass die von der Abfrage erfassten Zeilen nicht aktualisiert werden oder alle Anforderungen für Seiten von der Abfrage mit einer Momentaufnahme in einer einzelnen Transaktion oder einer serialisierbare Transaktionsisolationsstufe ausgeführt werden. Weitere Informationen zu Transaktionsisolationsstufen finden Sie unter SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

  2. Die ORDER BY-Klausel enthält eine Spalte oder eine Kombination von Spalten, die garantiert nur einmal vorhanden sind.

Weitere Informationen finden Sie im Beispiel "Ausführen von mehreren Abfragen in einer einzelnen Transaktion" im Abschnitt "Beispiele" weiter unten in diesem Thema.

Wenn konsistente Ausführungspläne in der Auslagerungslösung wichtig sind, können Sie den OPTIMIZE FOR-Abfragehinweis für den OFFSET-Parameter und den FETCH-Parameter verwenden. Weitere Informationen finden Sie unter "Angeben von Ausdrücken für OFFSET- und FETCH-Werten" im Abschnitt "Beispiele" weiter unten in diesem Thema. Weitere Informationen zu OPTIMIZE FOR finden Sie unter Abfragehinweise (Transact-SQL).

Beispiele

Category Funktionssyntaxelemente
Grundlegende Syntax ORDER BY
Angeben der auf- und absteigenden Sortierreihenfolge DESC * ASC
Angeben einer Sortierung COLLATE
Angeben einer bedingten Reihenfolge CASE-Ausdruck
Verwenden von ORDER BY in einer Rangfolgefunktion Rangfolgefunktionen
Beschränken der Anzahl der zurückgegebenen Zeilen OFFSET * FETCH
Verwenden von ORDER BY mit UNION, EXCEPT und INTERSECT UNION

Grundlegende Syntax

Anhand von Beispielen in diesem Abschnitt wird die grundlegende Funktion der ORDER BY-Klausel mithilfe der mindestens erforderlichen Syntax veranschaulicht.

A. Angeben einer einzelnen Spalte, die in der Auswahlliste definiert ist

Im folgenden Beispiel wird das Resultset anhand der numerischen ProductID-Spalte sortiert. Da keine bestimmte Sortierreihenfolge angegeben wird, wird die Standardsortierung (aufsteigende Reihenfolge) verwendet.

USE AdventureWorks2022;  
GO  
SELECT ProductID, Name FROM Production.Product  
WHERE Name LIKE 'Lock Washer%'  
ORDER BY ProductID;  

B. Angeben einer Spalte, die nicht in der Auswahlliste definiert wird

Im folgenden Beispiel wird das Resultset anhand einer Spalte sortiert, die nicht in der Auswahlliste enthalten ist, jedoch in der Tabelle in der FROM-Klausel definiert wird.

USE AdventureWorks2022;  
GO  
SELECT ProductID, Name, Color  
FROM Production.Product  
ORDER BY ListPrice;  

C. Angeben eines Alias als Sortierspalte

Im folgenden Beispiel wird der Spaltenalias SchemaName als Sortierspalte angegeben.

USE AdventureWorks2022;  
GO  
SELECT name, SCHEMA_NAME(schema_id) AS SchemaName  
FROM sys.objects  
WHERE type = 'U'  
ORDER BY SchemaName;  

D: Angeben eines Ausdrucks als Sortierspalte

Im folgenden Beispiel wird ein Ausdruck als Sortierspalte verwendet. Der Ausdruck wird mit der DATEPART-Funktion definiert, um das Resultset nach dem Jahr zu sortieren, in dem ein Mitarbeiter eingestellt wurde.

USE AdventureWorks2022;  
GO  
SELECT BusinessEntityID, JobTitle, HireDate  
FROM HumanResources.Employee  
ORDER BY DATEPART(year, HireDate);  

Angeben der auf- und absteigenden Sortierreihenfolge

A. Angeben einer absteigenden Reihenfolge

Im folgenden Beispiel wird das Resultset anhand der numerischen ProductID-Spalte in absteigender Reihenfolge sortiert.

USE AdventureWorks2022;  
GO  
SELECT ProductID, Name FROM Production.Product  
WHERE Name LIKE 'Lock Washer%'  
ORDER BY ProductID DESC;  

B. Angeben einer aufsteigenden Reihenfolge

Im folgenden Beispiel wird das Resultset anhand der Name-Spalte in aufsteigender Reihenfolge sortiert. Die Zeichen sind alphabetisch und nicht numerisch sortiert. Das heißt, 10 steht in der Sortierreihenfolge vor 2.

USE AdventureWorks2022;  
GO  
SELECT ProductID, Name FROM Production.Product  
WHERE Name LIKE 'Lock Washer%'  
ORDER BY Name ASC ;  

C. Angeben von auf- und absteigender Reihenfolge

Im folgenden Beispiel wird das Resultset anhand von zwei Spalten sortiert. Das Abfrageresultset wird zunächst anhand der FirstName-Spalte in aufsteigender und anschließend anhand der LastName-Spalte in absteigender Reihenfolge sortiert.

USE AdventureWorks2022;  
GO  
SELECT LastName, FirstName FROM Person.Person  
WHERE LastName LIKE 'R%'  
ORDER BY FirstName ASC, LastName DESC ;  

Angeben einer Sortierung

Im folgenden Beispiel wird gezeigt, wie sich die Reihenfolge, in der die Abfrageergebnisse zurückgegeben werden, durch Angeben einer Sortierung in der ORDER BY-Klausel ändern kann. Es wird eine Tabelle mit einer Spalte erstellt, bei deren Sortierung weder die Groß- und Kleinschreibung beachtet noch nach Akzent unterschieden wird. Werte werden mit Groß- und Kleinschreibung sowie unterschiedlichen Akzenten eingefügt. Da in der ORDER BY-Klausel keine Sortierung angegeben wurde, wird von der ersten Abfrage die Sortierung der Spalte beim Sortieren der Werte verwendet. In der zweiten Abfrage wird in der ORDER BY-Klausel eine Sortierung angegeben, bei der die Groß- und Kleinschreibung beachtet und Akzente unterschieden werden; dadurch ändert sich die Reihenfolge, in der die Zeilen zurückgegeben werden.

USE tempdb;  
GO  
CREATE TABLE #t1 (name NVARCHAR(15) COLLATE Latin1_General_CI_AI)  
GO  
INSERT INTO #t1 VALUES(N'Sánchez'),(N'Sanchez'),(N'sánchez'),(N'sanchez');  
  
-- This query uses the collation specified for the column 'name' for sorting.  
SELECT name  
FROM #t1  
ORDER BY name;  
-- This query uses the collation specified in the ORDER BY clause for sorting.  
SELECT name  
FROM #t1  
ORDER BY name COLLATE Latin1_General_CS_AS;  

Angeben einer bedingten Reihenfolge

In den folgenden Beispielen wird der CASE-Ausdruck in einer ORDER BY-Klausel verwendet, um die Sortierreihenfolge der Zeilen auf Grundlage eines angegebenen Spaltenwerts bedingt zu bestimmen. Im ersten Beispiel wird der Wert in der SalariedFlag-Spalte der HumanResources.Employee-Tabelle ausgewertet. Mitarbeiter, deren SalariedFlag auf 1 festgelegt wurde, werden nach BusinessEntityID in absteigender Folge zurückgegeben. Mitarbeiter, deren SalariedFlag auf 0 festgelegt wurde, werden nach BusinessEntityID in aufsteigender Folge zurückgegeben. Im zweiten Beispiel wird das Resultset nach der TerritoryName-Spalte sortiert, wenn die CountryRegionName-Spalte gleich 'United States' ist, und bei allen anderen Zeilen nach CountryRegionName.

SELECT BusinessEntityID, SalariedFlag  
FROM HumanResources.Employee  
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC  
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;  
GO  
SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName  
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL  
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName  
         ELSE CountryRegionName END;  

Verwenden von ORDER BY in einer Rangfolgefunktion

Im folgenden Beispiel wird die ORDER BY-Klausel in den Rangfolgefunktionen ROW_NUMBER, RANK, DENSE_RANK und NTILE verwendet.

USE AdventureWorks2022;  
GO  
SELECT p.FirstName, p.LastName  
    ,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"  
    ,RANK() OVER (ORDER BY a.PostalCode) AS "Rank"  
    ,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"  
    ,NTILE(4) OVER (ORDER BY a.PostalCode) AS "Quartile"  
    ,s.SalesYTD, a.PostalCode  
FROM Sales.SalesPerson AS s   
    INNER JOIN Person.Person AS p   
        ON s.BusinessEntityID = p.BusinessEntityID  
    INNER JOIN Person.Address AS a   
        ON a.AddressID = p.BusinessEntityID  
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;  

Beschränken der Anzahl der zurückgegebenen Zeilen

In den folgenden Beispielen wird die Anzahl der Zeilen, die von einer Abfrage zurückgegeben werden, mit OFFSET und FETCH eingeschränkt.

Gilt für: SQL Server 2012 (11.x) und höher sowie Azure SQL-Datenbank.

A. Angeben von ganzzahligen Konstanten für OFFSET- und FETCH-Werte

Im folgenden Beispiel wird eine ganzzahlige Konstante als Wert für die OFFSET- und die FETCH-Klausel angegeben. Die erste Abfrage gibt alle Zeilen nach der DepartmentID-Spalte sortiert zurück. Vergleichen Sie die von dieser Abfrage zurückgegebenen Ergebnisse mit denen der beiden folgenden Abfragen. In der folgenden Abfrage werden mit der OFFSET 5 ROWS-Klausel die ersten 5 Zeilen übersprungen und alle verbleibenden Zeilen zurückgegeben. In der letzten Abfrage wird mit der OFFSET 0 ROWS-Klausel bei der ersten Zeile begonnen, und anschließend wird mit FETCH NEXT 10 ROWS ONLY die Anzahl der zurückgegebenen Zeilen vom sortierten Resultset auf 10 begrenzt.

USE AdventureWorks2022;  
GO  
-- Return all rows sorted by the column DepartmentID.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID;  
  
-- Skip the first 5 rows from the sorted result set and return all remaining rows.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID OFFSET 5 ROWS;  
  
-- Skip 0 rows and return only the first 10 rows from the sorted result set.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID   
    OFFSET 0 ROWS  
    FETCH NEXT 10 ROWS ONLY;  

B. Angeben von Variablen für OFFSET- und FETCH-Werte

Im folgenden Beispiel werden die Variablen @RowsToSkip und @FetchRows deklariert und in der OFFSET- und in der FETCH-Klausel angegeben.

USE AdventureWorks2022;  
GO  
-- Specifying variables for OFFSET and FETCH values    
DECLARE @RowsToSkip TINYINT = 2
      , @FetchRows TINYINT = 8;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @RowsToSkip ROWS   
    FETCH NEXT @FetchRows ROWS ONLY;  

C. Angeben von Ausdrücken für OFFSET- und FETCH-Werte

Im folgenden Beispiel wird der OFFSET-Wert mit dem Ausdruck @StartingRowNumber - 1 und der FETCH-Wert mit dem Ausdruck @EndingRowNumber - @StartingRowNumber + 1 angegeben. Außerdem wird der Abfragehinweis OPTIMIZE FOR angegeben. Mit dem Abfragehinweis kann ein bestimmter Wert für eine lokale Variable bereitgestellt werden, wenn die Abfrage kompiliert und optimiert wird. Dieser Wert wird nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung. Weitere Informationen finden Sie unter Abfragehinweise (Transact-SQL).

USE AdventureWorks2022;  
GO  
  
-- Specifying expressions for OFFSET and FETCH values      
DECLARE @StartingRowNumber TINYINT = 1  
      , @EndingRowNumber TINYINT = 8;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber - 1 ROWS   
    FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY  
OPTION ( OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20) );  

D: Angeben einer konstanten skalaren Unterabfrage für OFFSET- und FETCH-Werte

Im folgenden Beispiel wird der Wert für die FETCH-Klausel mit einer konstanten skalaren Unterabfrage definiert. Die Unterabfrage gibt einen einzelnen Wert von der Spalte PageSize in der Tabelle dbo.AppSettings zurück.

-- Specifying a constant scalar subquery  
USE AdventureWorks2022;  
GO  
CREATE TABLE dbo.AppSettings (AppSettingID INT NOT NULL, PageSize INT NOT NULL);  
GO  
INSERT INTO dbo.AppSettings VALUES(1, 10);  
GO  
DECLARE @StartingRowNumber TINYINT = 1;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber ROWS   
    FETCH NEXT (SELECT PageSize FROM dbo.AppSettings WHERE AppSettingID = 1) ROWS ONLY;  

E. Ausführen mehrerer Abfragen in einer einzelnen Transaktion

Im folgenden Beispiel wird eine Methode veranschaulicht, eine Auslagerungslösung zu implementieren, die sicherstellt, dass in allen Anforderungen beständige Ergebnisse von der Abfrage zurückgegeben werden. Die Abfrage wird mit der Momentaufnahmeisolationsstufe in einer einzelnen Transaktion ausgeführt, und die in der ORDER BY-Klausel angegebene Spalte stellt die Eindeutigkeit der Spalten sicher.

USE AdventureWorks2022;  
GO  
  
-- Ensure the database can support the snapshot isolation level set for the query.  
IF (SELECT snapshot_isolation_state FROM sys.databases WHERE name = N'AdventureWorks2022') = 0  
    ALTER DATABASE AdventureWorks2022 SET ALLOW_SNAPSHOT_ISOLATION ON;  
GO  
  
-- Set the transaction isolation level  to SNAPSHOT for this query.  
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
GO  
  
-- Beginning the transaction.
BEGIN TRANSACTION;  
GO  
-- Declare and set the variables for the OFFSET and FETCH values.  
DECLARE @StartingRowNumber INT = 1  
      , @RowCountPerPage INT = 3;  
  
-- Create the condition to stop the transaction after all rows have been returned.  
WHILE (SELECT COUNT(*) FROM HumanResources.Department) >= @StartingRowNumber  
BEGIN  
  
-- Run the query until the stop condition is met.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber - 1 ROWS   
    FETCH NEXT @RowCountPerPage ROWS ONLY;  
  
-- Increment @StartingRowNumber value.  
SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;  
CONTINUE  
END;  
GO  
COMMIT TRANSACTION;  
GO  

Verwenden von ORDER BY mit UNION, EXCEPT und INTERSECT

Wenn eine Abfrage die Operatoren UNION, EXCEPT oder INTERSECT verwendet, muss die ORDER BY-Klausel am Ende der Anweisung angegeben werden, und die Ergebnissen der kombinierten Abfragen werden sortiert. Im folgenden Beispiel werden alle Produkte zurückgegeben, die rot oder gelb sind, und die kombinierte Liste wird anhand der Spalte ListPrice sortiert.

USE AdventureWorks2022;  
GO  
SELECT Name, Color, ListPrice  
FROM Production.Product  
WHERE Color = 'Red'  
-- ORDER BY cannot be specified here.  
UNION ALL  
SELECT Name, Color, ListPrice  
FROM Production.Product  
WHERE Color = 'Yellow'  
ORDER BY ListPrice ASC;  

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

Das folgende Beispiel veranschaulicht ein Resultset sortiert nach der numerischen EmployeeKey-Spalte in aufsteigender Reihenfolge.

-- Uses AdventureWorks  
  
SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY EmployeeKey;  

Im folgenden Beispiel wird ein Resultset anhand der numerischen EmployeeKey-Spalte in absteigender Reihenfolge sortiert.

-- Uses AdventureWorks  
  
SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY EmployeeKey DESC;  

Im folgenden Beispiel wird das Resultset anhand der LastName-Spalte sortiert.

-- Uses AdventureWorks  
  
SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY LastName;  

Im folgenden Beispiel wird das Resultset anhand von zwei Spalten sortiert. In dieser Abfrage wird zuerst nach der FirstName-Spalte in aufsteigender Reihenfolge sortiert, und anschließend werden FirstName-Werte nach der LastName-Spalte in absteigender Reihenfolge sortiert.

-- Uses AdventureWorks  
  
SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY LastName, FirstName;  

Weitere Informationen

Ausdrücke (Transact-SQL)
SELECT (Transact-SQL)
FROM (Transact-SQL)
Rangfolgefunktionen (Transact-SQL)
TOP (Transact-SQL)
Abfragehinweise (Transact-SQL)
EXCEPT und INTERSECT (Transact-SQL)
UNION (Transact-SQL)
CASE (Transact-SQL)