Freigeben über


SELECT - ORDER BY-Klausel (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank 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, werden 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 für SQL Server und Azure SQL-Datenbank

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 für Azure Synapse Analytics und Parallel Data Warehouse.

[ ORDER BY
    {
    order_by_expression
    [ ASC | DESC ]
    } [ , ...n ]
]

Argumente

order_by_expression

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

Es können mehrere Sortierspalten angegeben werden. Spaltennamen müssen eindeutig sein. Die Abfolge der Sortierspalten in der ORDER BY Klausel definiert die Organisation 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 einem Spalten- oder Spaltenalias in der Auswahlliste oder einer spalte entsprechen, die in einer in der FROM Klausel angegebenen Tabelle ohne Mehrdeutigkeiten definiert ist. Wenn die ORDER BY Klausel auf einen Spaltenalias aus der Auswahlliste verweist, muss der Spaltenalias eigenständig und nicht als Teil eines Ausdrucks in ORDER BY Klausel verwendet werden, z. B.:

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 Sortierung der Spalte gemäß der Definition in der Tabelle oder Ansicht ausgeführt werden soll. Die collation_name kann entweder ein Windows-Sortierungsname oder ein SQL-Sortierungsname sein. Weitere Informationen finden Sie unter Sortierungs- und Unicode-Support. COLLATEgilt nur für Spalten vom Typ Char, varchar, nchar und nvarchar.

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 möglichen Werte behandelt.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

Gilt für: SQL Server 2012 (11.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.

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.

offset_row_count_expression kann eine Variable, ein Parameter oder eine konstante skalare Unterabfrage sein. Wenn eine Unterabfrage verwendet wird, kann sie nicht auf spalten verweisen, die im äußeren Abfragebereich definiert sind. Das heißt, es kann nicht mit der äußeren Abfrage korreliert werden.

ROW synonyme ROWS und werden zur 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

Gilt für: SQL Server 2012 (11.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.

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.

fetch_row_count_expression kann eine Variable, ein Parameter oder eine konstante skalare Unterabfrage sein. Wenn eine Unterabfrage verwendet wird, kann sie nicht auf spalten verweisen, die im äußeren Abfragebereich definiert sind. Das heißt, es kann nicht mit der äußeren Abfrage korreliert werden.

FIRST synonyme NEXT und werden zur ANSI-Kompatibilität bereitgestellt.

ROW synonyme ROWS und werden zur ANSI-Kompatibilität bereitgestellt.

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

Bewährte Methoden

Vermeiden Sie die Angabe ganzzahliger Zahlen in der ORDER BY Klausel als positionale Darstellungen der Spalten in der Auswahlliste. Obwohl beispielsweise eine Anweisung wie SELECT ProductID, Name FROM Production.Production ORDER BY 2 gültig ist, ist die Anweisung nicht so leicht zu verstehen, wie sie mit der Angabe des tatsächlichen Spaltennamens verglichen wird. Darüber hinaus müssen Änderungen an der Auswahlliste, z. B. das Ändern der Spaltenreihenfolge oder das Hinzufügen neuer Spalten, die ORDER BY Klausel ändern, um unerwartete Ergebnisse zu vermeiden.

Verwenden Sie in einer SELECT TOP (<n>) Anweisung immer eine ORDER BY Klausel. Dies ist die einzige Möglichkeit, vorhersagbar anzugeben, von TOPwelchen Zeilen betroffen sind. Weitere Informationen finden Sie unter TOP.

Interoperabilität

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

Die Verwendung OFFSET und FETCH in einer Ansicht ändert die Aktualisierungseigenschaft der Ansicht nicht.

Begrenzungen

Es gibt keine Beschränkung auf die Anzahl der Spalten in der ORDER BY Klausel. Die Gesamtgröße der in einer ORDER BY Klausel angegebenen Spalten darf jedoch 8.060 Bytes nicht überschreiten.

Spalten vom Typ ntext, Text, Bild, Geografie, Geometrie und XML können nicht in einer ORDER BY Klausel verwendet werden.

Eine ganze Zahl oder Konstante kann nicht angegeben werden, wenn order_by_expression in einer Bewertungsfunktion angezeigt wird. Weitere Informationen finden Sie unter SELECT - OVER-Klausel.

Wenn ein Tabellenname in der FROM Klausel aliast ist, kann nur der Aliasname verwendet werden, um seine Spalten in der ORDER BY Klausel zu qualifizieren.

Spaltennamen und Aliase, die in der ORDER BY Klausel angegeben sind, 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 außerdem einen UNION, EXCEPToder INTERSECT Operator enthält, müssen die Spaltennamen oder Spaltenaliasen in der Auswahlliste der ersten Abfrage (linksbündig) angegeben werden.

In einer Abfrage, die UNIONoperatoren EXCEPTverwendet INTERSECT ORDER BY , ist nur am Ende der Anweisung zulässig. Diese Einschränkung gilt nur, wenn Sie eine EXCEPTAbfrage auf oberster Ebene und INTERSECT nicht in einer Unterabfrage angebenUNION. Siehe den folgenden Abschnitt "Beispiele ".

Die ORDER BY Klausel ist in Ansichten, Inlinefunktionen, abgeleiteten Tabellen und Unterabfragen nicht gültig, es sei denn, die TOP Klauseln oder OFFSET Klauseln FETCH werden ebenfalls angegeben. Wenn ORDER BY sie in diesen Objekten verwendet wird, wird die Klausel nur verwendet, um die zeilen zu bestimmen, die von der TOP Klausel oder OFFSET FETCH Klausel zurückgegeben werden. Die ORDER BY Klausel garantiert keine sortierten Ergebnisse, wenn diese Konstrukte abgefragt werden, es sei denn ORDER BY , sie werden auch in der Abfrage selbst angegeben.

OFFSET und FETCH werden in indizierten Ansichten oder in einer Ansicht, die mithilfe der CHECK OPTION Klausel definiert wird, nicht unterstützt.

OFFSET und FETCH kann in jeder Abfrage verwendet werden, die die folgenden Einschränkungen zulässt TOP und ORDER BY die folgenden Einschränkungen zulässt:

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

  • OFFSET und FETCH kann nicht direkt in INSERT, UPDATE, , MERGEund DELETE Anweisungen angegeben werden, aber in einer Unterabfrage angegeben werden, die in diesen Anweisungen definiert ist. Beispiel: In der INSERT INTO SELECT Anweisung OFFSET und FETCH kann in der SELECT Anweisung angegeben werden.

  • In einer Abfrage, die UNIONoperatoren EXCEPT verwendet und INTERSECT FETCH nur in der endgültigen Abfrage angegeben werden kann, OFFSET 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

Sie sollten anstelle der TOP Klausel die OFFSET Klausel FETCH verwenden, um eine Abfrage paging-Lösung zu implementieren und die Anzahl der Zeilen zu begrenzen, die an eine Clientanwendung gesendet werden.

Für die Verwendung OFFSET und FETCH als Auslagerungslösung muss die Abfrage für jede Datenseite , die an die Clientanwendung zurückgegeben wird, einmal ausgeführt werden. Um beispielsweise die Ergebnisse einer Abfrage in 10 Zeilenschritten zurückzugeben, müssen Sie die Abfrage einmal ausführen, um Zeilen 1 bis 10 zurückzugeben, und dann die Abfrage erneut ausführen, um Zeilen 11 bis 20 zurückzugeben 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 zu erzielen, müssen OFFSET FETCHdie folgenden Bedingungen erfüllt sein:

  1. Die zugrunde liegenden Daten, die von der Abfrage verwendet werden, dürfen sich nicht ändern. Das heißt, die zeilen, die von der Abfrage berührt werden, werden nicht aktualisiert, oder alle Anforderungen für Seiten aus der Abfrage werden in einer einzigen Transaktion mithilfe von Snapshot- oder serialisierbarer Transaktionsisolation ausgeführt. Weitere Informationen zu diesen Transaktionsisolationsstufen finden Sie unter SET TRANSACTION ISOLATION LEVEL.

  2. Die ORDER BY Klausel enthält eine Spalte oder Eine Kombination von Spalten, die garantiert eindeutig sind.

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

Wenn konsistente Ausführungspläne in Ihrer Auslagerungslösung wichtig sind, sollten Sie die OPTIMIZE FOR Abfragehinweise für die und FETCH die OFFSET Parameter verwenden. Siehe Angeben von Ausdrücken für OFFSET- und FETCH-Werte im Abschnitt "Beispiele " weiter unten in diesem Artikel. Weitere Informationen finden OPTIMIZE FORSie unter Abfragehinweise.

Beispiele

Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022- oder AdventureWorksDW2022-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.

Kategorie Funktionssyntaxelemente
Grundlegende Syntax ORDER BY
Aufsteigende und absteigende Reihenfolge angeben DESC oder ASC
Angeben einer Sortierung COLLATE
Angeben einer bedingten Reihenfolge CASE-Ausdruck
Verwenden von ORDER BY in einer Bewertungsfunktion Rangfolgefunktionen
Beschränken der Anzahl der zurückgegebenen Zeilen OFFSET und FETCH
VERWENDEN VON ORDER BY mit UNION, EXCEPT und INTERSECT UNION

Grundlegende Syntax

Beispiele in diesem Abschnitt veranschaulichen die grundlegenden Funktionen der ORDER BY Klausel mithilfe der minimal erforderlichen Syntax.

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 ist, wird die Standardreihenfolge (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 in der Auswahlliste nicht definiert ist

Im folgenden Beispiel wird das Resultset nach einer Spalte sortiert, die nicht in der Auswahlliste enthalten ist, aber in der in der FROM Klausel angegebenen Tabelle definiert ist.

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 mithilfe der DATEPART Funktion definiert, um das Resultset nach dem Jahr zu sortieren, in dem Mitarbeiter eingestellt wurden.

USE AdventureWorks2022;
GO

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

Aufsteigende und absteigende Sortierreihenfolge angeben

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 aufsteigender 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

Das folgende Beispiel zeigt, wie das Angeben einer Sortierung in der ORDER BY Klausel die Reihenfolge ändern kann, in der die Abfrageergebnisse zurückgegeben werden. 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 unterschiedlichen Groß- und Kleinschreibungs- und Akzentunterschieden eingefügt. Da in der ORDER BY Klausel keine Sortierung angegeben ist, verwendet die erste Abfrage beim Sortieren der Werte die Sortierung der Spalte. In der zweiten Abfrage wird eine Sortierung zwischen Groß- und Kleinschreibung und Akzent vertraulich in der ORDER BY Klausel angegeben, wodurch die Reihenfolge geändert wird, 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 basierend auf einem bestimmten Spaltenwert 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 Bewertungsfunktion

Im folgenden Beispiel wird die ORDER BY Klausel in den Rangfolgenfunktionen ROW_NUMBER, , RANK, DENSE_RANKund NTILE.

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

Gilt für: SQL Server 2012 (11.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.

In den folgenden Beispielen wird die Anzahl der zeilen, die von einer Abfrage zurückgegeben werden, verwendet OFFSET und FETCH beschränkt.

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

Im folgenden Beispiel wird eine ganze Zahl als Wert für die OFFSET Und-Klauseln FETCH 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. Die nächste Abfrage verwendet die Klausel OFFSET 5 ROWS , um die ersten fünf Zeilen zu überspringen und alle verbleibenden Zeilen zurückzugeben. 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 deklariert und @FetchRows diese Variablen in den OFFSET Und-Klauseln FETCH 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 Ausdruck @StartingRowNumber - 1 verwendet, um den OFFSET Wert und den Ausdruck @EndingRowNumber - @StartingRowNumber + 1 anzugeben, um den FETCH-Wert anzugeben. Darüber hinaus wird der Abfragehinweis angegeben OPTIMIZE FOR. 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.

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 eine konstante skalare Unterabfrage verwendet, um den Wert für die FETCH Klausel zu definieren. 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 in einer einzelnen Transaktion mithilfe der Snapshotisolationsstufe 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 UNION, EXCEPToder INTERSECT Operatoren verwendet, muss die ORDER BY Klausel am Ende der Anweisung angegeben werden, und die Ergebnisse 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;