Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
              Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Hiermee sorteert u gegevens die worden geretourneerd door een query in SQL Server. Gebruik deze component om:
- Bestel de resultatenset van een query op basis van de opgegeven kolomlijst en beperk eventueel de rijen die worden geretourneerd naar een opgegeven bereik. De volgorde waarin rijen worden geretourneerd in een resultatenset worden niet gegarandeerd, tenzij er een - ORDER BYcomponent is opgegeven.
- Bepaal de volgorde waarin classificatiefunctiewaarden worden toegepast op de resultatenset. 
              
              
              Transact-SQL syntaxis-conventies
Note
              ORDER BY wordt niet ondersteund in SELECT/INTO of CREATE TABLE AS SELECT (CTAS)-instructies in Azure Synapse Analytics of Analytics Platform System (PDW).
Syntax
Syntaxis voor SQL Server en 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
    ]
}
Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse.
[ ORDER BY
    {
    order_by_expression
    [ ASC | DESC ]
    } [ , ...n ]
]
Arguments
order_by_expression
Hiermee geeft u een kolom of expressie op waarop de queryresultatenset moet worden gesorteerd. Een sorteerkolom kan worden opgegeven als een naam of kolomalias, of een niet-negatief geheel getal dat de positie van de kolom in de selectielijst aangeeft.
U kunt meerdere sorteerkolommen opgeven. Kolomnamen moeten uniek zijn. De volgorde van de sorteerkolommen in de ORDER BY component definieert de organisatie van de gesorteerde resultatenset. Dat wil gezegd: de resultatenset wordt gesorteerd op de eerste kolom en vervolgens wordt die geordende lijst gesorteerd op de tweede kolom, enzovoort.
De kolomnamen waarnaar in de ORDER BY component wordt verwezen, moeten overeenkomen met een kolom- of kolomalias in de selectielijst of met een kolom die is gedefinieerd in een tabel die in de FROM component is opgegeven, zonder dubbelzinnigheid. Als de ORDER BY component verwijst naar een kolomalias in de selectielijst, moet de kolomalias zelfstandig worden gebruikt en niet als onderdeel van een expressie in ORDER BY component, bijvoorbeeld:
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
Hiermee geeft u op dat de ORDER BY bewerking moet worden uitgevoerd volgens de sortering die is opgegeven in collation_name, en niet volgens de sortering van de kolom zoals gedefinieerd in de tabel of weergave. De collation_name kan een Windows-sorteringsnaam of een SQL-sorteringsnaam zijn. Zie Sortering en Unicode-ondersteuningvoor meer informatie. 
              COLLATE is alleen van toepassing op kolommen van het type teken, varchar, ncharen nvarchar.
ASC | DESC
Hiermee geeft u op dat de waarden in de opgegeven kolom in oplopende of aflopende volgorde moeten worden gesorteerd. 
              ASC sorteert van de laagste waarde naar de hoogste waarde. 
              DESC sorteert van de hoogste waarde naar de laagste waarde. 
              ASC is de standaardsorteerdervolgorde. 
              NULL waarden worden behandeld als de laagst mogelijke waarden.
VERSCHUIVING { integer_constant offset_row_count_expression | } { RIJ | RIJEN }
Van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.
Hiermee geeft u het aantal rijen op dat moet worden overgeslagen voordat er rijen worden geretourneerd uit de query-expressie. De waarde kan een geheel getalconstante of expressie zijn die groter is dan of gelijk is aan nul.
offset_row_count_expression kan een variabele, parameter of constante scalaire subquery zijn. Wanneer een subquery wordt gebruikt, kan deze niet verwijzen naar kolommen die zijn gedefinieerd in het buitenste querybereik. Dat wil gezegd, het kan niet worden gecorreleerd met de buitenste query.
              ROW en ROWS synoniemen zijn en worden geleverd voor ANSI-compatibiliteit.
In queryuitvoeringsplannen wordt de waarde voor het aantal offsetrijen weergegeven in het kenmerk Offset van de TOP queryoperator.
FETCH { FIRST | VOLGENDE } { integer_constant fetch_row_count_expression | } { ROW | ALLEEN RIJEN }
Van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.
Hiermee geeft u het aantal rijen op dat moet worden geretourneerd nadat de OFFSET component is verwerkt. De waarde kan een geheel getalconstante of expressie zijn die groter is dan of gelijk is aan één.
fetch_row_count_expression kan een variabele, parameter of constante scalaire subquery zijn. Wanneer een subquery wordt gebruikt, kan deze niet verwijzen naar kolommen die zijn gedefinieerd in het buitenste querybereik. Dat wil gezegd, het kan niet worden gecorreleerd met de buitenste query.
              FIRST en NEXT synoniemen zijn en worden geleverd voor ANSI-compatibiliteit.
              ROW en ROWS synoniemen zijn en worden geleverd voor ANSI-compatibiliteit.
In queryuitvoeringsplannen wordt de waarde voor het aantal offsetrijen weergegeven in het kenmerk Rijen of Het bovenste kenmerk van de TOP queryoperator.
Best practices
Vermijd het opgeven van gehele getallen in de ORDER BY component als positionele weergaven van de kolommen in de selectielijst. Hoewel een instructie zoals SELECT ProductID, Name FROM Production.Production ORDER BY 2 geldig is, is de instructie bijvoorbeeld niet zo gemakkelijk te begrijpen door anderen vergeleken met het opgeven van de werkelijke kolomnaam. Daarnaast moeten wijzigingen in de selectielijst, zoals het wijzigen van de kolomvolgorde of het toevoegen van nieuwe kolommen, de ORDER BY component wijzigen om onverwachte resultaten te voorkomen.
Gebruik in een SELECT TOP (<n>) instructie altijd een ORDER BY component. Dit is de enige manier om voorspelbaar aan te geven welke rijen worden beïnvloed door TOP. Zie TOP voor meer informatie.
Interoperability
Wanneer u met een of INSERT...SELECT instructie rijen uit een SELECT...INTO andere bron invoegt, garandeert de ORDER BY component niet dat de rijen in de opgegeven volgorde worden ingevoegd.
Als OFFSET u de eigenschap bijwerkbaarheid van de weergave gebruikt en FETCH in een weergave niet wijzigt.
Limitations
Er is geen limiet voor het aantal kolommen in de ORDER BY component. De totale grootte van de kolommen die zijn opgegeven in een ORDER BY component mag echter niet groter zijn dan 8060 bytes.
Kolommen van het type ntext, tekst, afbeelding, geografie, geometrie en XML kunnen niet worden gebruikt in een ORDER BY component.
Een geheel getal of constante kan niet worden opgegeven wanneer order_by_expression wordt weergegeven in een classificatiefunctie. Zie SELECT - OVER-component voor meer informatie.
Als een tabelnaam wordt alias in de FROM component, kan alleen de aliasnaam worden gebruikt om de kolommen in de ORDER BY component te kwalificeren.
Kolomnamen en aliassen die in de ORDER BY component zijn opgegeven, moeten worden gedefinieerd in de selectielijst als de SELECT instructie een van de volgende componenten of operators bevat:
- 
              UNIONbediener
- 
              EXCEPTbediener
- 
              INTERSECTbediener
- SELECT DISTINCT
Als de instructie bovendien een UNION, EXCEPTof INTERSECT operator bevat, moeten de kolomnamen of kolomaliassen worden opgegeven in de selectielijst van de eerste (linkse) query.
In een query die gebruikmaakt UNIONvan, EXCEPTof INTERSECT operators, ORDER BY is alleen toegestaan aan het einde van de instructie. Deze beperking geldt alleen voor wanneer u opgeeft UNION, EXCEPTen INTERSECT in een query op het hoogste niveau en niet in een subquery. Zie de volgende sectie Voorbeelden .
De ORDER BY component is niet geldig in weergaven, inlinefuncties, afgeleide tabellen en subquery's, tenzij de TOP of OFFSET en FETCH componenten ook worden opgegeven. Wanneer ORDER BY deze objecten worden gebruikt, wordt de component alleen gebruikt om de rijen te bepalen die worden geretourneerd door de TOP component of OFFSET componenten FETCH . De ORDER BY component garandeert geen geordende resultaten wanneer deze constructies worden opgevraagd, tenzij ORDER BY deze ook worden opgegeven in de query zelf.
              OFFSET en FETCH worden niet ondersteund in geïndexeerde weergaven of in een weergave die is gedefinieerd met behulp van de CHECK OPTION component.
              OFFSET en FETCH kan worden gebruikt in elke query die de volgende beperkingen toestaat TOP en ORDER BY met de volgende beperkingen:
- De - OVERcomponent biedt geen ondersteuning- OFFSETvoor en- FETCH.
- OFFSETen- FETCHkan niet rechtstreeks worden opgegeven in- INSERT,- UPDATEen- MERGE- DELETEinstructies, maar kan worden opgegeven in een subquery die in deze instructies is gedefinieerd. In de- INSERT INTO SELECTinstructie- OFFSETkan- FETCHbijvoorbeeld worden opgegeven in de- SELECTinstructie.
- In een query die gebruikmaakt - UNIONvan ,- EXCEPTof- INTERSECToperators,- OFFSETen- FETCHkan alleen worden opgegeven in de uiteindelijke query die de volgorde van de queryresultaten aangeeft.
- TOPkan niet worden gecombineerd met- OFFSETen- FETCHin dezelfde query-expressie (in hetzelfde querybereik).
VERSCHUIVING en OPHALEN gebruiken om de geretourneerde rijen te beperken
U moet de OFFSET en FETCH componenten gebruiken in plaats van de TOP component om een oplossing voor het pageren van query's te implementeren en het aantal rijen dat naar een clienttoepassing wordt verzonden, te beperken.
Voor het gebruik OFFSET en FETCH als pagingoplossing moet de query één keer worden uitgevoerd voor elke pagina met gegevens die worden geretourneerd naar de clienttoepassing. Als u bijvoorbeeld de resultaten van een query wilt retourneren in stappen van 10 rijen, moet u de query één keer uitvoeren om rijen 1 tot 10 te retourneren en vervolgens de query opnieuw uit te voeren om rij 11 tot 20 te retourneren, enzovoort. Elke query is onafhankelijk en is op geen enkele manier aan elkaar gerelateerd. Dit betekent dat, in tegenstelling tot het gebruik van een cursor waarin de query eenmaal wordt uitgevoerd en de status op de server wordt gehandhaafd, de clienttoepassing verantwoordelijk is voor het bijhouden van de status. Als u stabiele resultaten wilt bereiken tussen queryaanvragen met behulp van OFFSET en FETCH, moet aan de volgende voorwaarden worden voldaan:
- De onderliggende gegevens die door de query worden gebruikt, mogen niet worden gewijzigd. Dat wil gezegd: de rijen die door de query worden aangeraakt, worden niet bijgewerkt of alle aanvragen voor pagina's van de query worden uitgevoerd in één transactie met behulp van momentopname- of serialiseerbare transactieisolatie. Zie SET TRANSACTION ISOLATION LEVEL voor meer informatie over deze transactieisolatieniveaus. 
- De - ORDER BYcomponent bevat een kolom of combinatie van kolommen die gegarandeerd uniek zijn.
Zie het voorbeeld 'Meerdere query's uitvoeren in één transactie' in de sectie Voorbeelden verderop in dit artikel.
Als consistente uitvoeringsplannen belangrijk zijn in uw pagingoplossing, kunt u overwegen om de OPTIMIZE FOR queryhint voor de OFFSET en FETCH parameters te gebruiken. Zie Expressies opgeven voor OFFSET- en FETCH-waarden in de sectie Voorbeelden verderop in dit artikel. Zie Queryhints voor meer informatie.OPTIMIZE FOR
Examples
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
| Category | Aanbevolen syntaxiselementen | 
|---|---|
| Basic syntax | ORDER BY | 
| Oplopende en aflopende volgorde opgeven | DESCofASC | 
| Een sortering opgeven | COLLATE | 
| Een voorwaardelijke volgorde opgeven | CASE-expressie | 
| ORDER BY gebruiken in een classificatiefunctie | Ranking functions | 
| Het aantal geretourneerde rijen beperken | OFFSETenFETCH | 
| ORDER BY gebruiken met UNION, EXCEPT en INTERSECT | UNION | 
Basic syntax
Voorbeelden in deze sectie laten de basisfunctionaliteit van de ORDER BY-component zien met behulp van de minimaal vereiste syntaxis.
A. Eén kolom opgeven die is gedefinieerd in de selectielijst
In het volgende voorbeeld wordt de resultatenset gesorteerd op basis van de numerieke ProductID kolom. Omdat er geen specifieke sorteervolgorde is opgegeven, wordt de standaardvolgorde (oplopende volgorde) gebruikt.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;
B. Een kolom opgeven die niet is gedefinieerd in de selectielijst
In het volgende voorbeeld wordt de resultatenset gesorteerd op een kolom die niet is opgenomen in de selectielijst, maar is gedefinieerd in de tabel die is opgegeven in de FROM component.
USE AdventureWorks2022;
GO
SELECT ProductID, Name, Color
FROM Production.Product
ORDER BY ListPrice;
C. Een alias opgeven als de sorteerkolom
In het volgende voorbeeld wordt de kolomalias SchemaName opgegeven als de sorteervolgordekolom.
USE AdventureWorks2022;
GO
SELECT name, SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;
D. Een expressie opgeven als de sorteerkolom
In het volgende voorbeeld wordt een expressie gebruikt als sorteerkolom. De expressie wordt gedefinieerd met behulp van de DATEPART functie om de resultatenset te sorteren op het jaar waarin werknemers zijn aangenomen.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY DATEPART(year, HireDate);
Oplopende en aflopende sorteervolgorde opgeven
A. Een aflopende volgorde opgeven
In het volgende voorbeeld wordt de resultatenset gesorteerd op de numerieke kolom ProductID in aflopende volgorde.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;
B. Een oplopende volgorde opgeven
In het volgende voorbeeld wordt de resultatenset door de Name kolom in oplopende volgorde gesorteerd. De tekens worden alfabetisch gesorteerd, niet numeriek. Dat wil gezegd, 10 sorteert voor 2.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC;
C. Zowel oplopende als aflopende volgorde opgeven
In het volgende voorbeeld wordt de resultatenset met twee kolommen gesorteerd. De resultatenset van de query wordt eerst gesorteerd in oplopende volgorde op de FirstName kolom en vervolgens gesorteerd in aflopende volgorde op de LastName kolom.
USE AdventureWorks2022;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC;
Een sortering opgeven
In het volgende voorbeeld ziet u hoe het opgeven van een sortering in de ORDER BY component de volgorde kan wijzigen waarin de queryresultaten worden geretourneerd. Er wordt een tabel gemaakt die een kolom bevat die is gedefinieerd met behulp van een hoofdlettergevoelige, accentgevoelige sortering. Waarden worden ingevoegd met verschillende hoofdletters en accentverschillen. Omdat er geen sortering is opgegeven in de ORDER BY component, gebruikt de eerste query de sortering van de kolom bij het sorteren van de waarden. In de tweede query wordt een hoofdlettergevoelige, accentgevoelige sortering opgegeven in de ORDER BY component, waarmee de volgorde wordt gewijzigd waarin de rijen worden geretourneerd.
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;
Een voorwaardelijke volgorde opgeven
In de volgende voorbeelden wordt de CASE expressie in een ORDER BY component gebruikt om de sorteervolgorde van de rijen voorwaardelijk te bepalen op basis van een bepaalde kolomwaarde. In het eerste voorbeeld wordt de waarde in de SalariedFlag kolom van de HumanResources.Employee tabel geëvalueerd. Werknemers die de SalariedFlag set hebben ingesteld op 1, worden op volgorde geretourneerd door de BusinessEntityID in aflopende volgorde. Werknemers met de SalariedFlag waarde 0 worden in oplopende BusinessEntityID volgorde geretourneerd. In het tweede voorbeeld wordt de resultatenset gerangschikt op de kolom TerritoryName wanneer de kolom CountryRegionName gelijk is aan 'Verenigde Staten' en CountryRegionName op voor alle andere rijen.
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;
ORDER BY gebruiken in een classificatiefunctie
In het volgende voorbeeld wordt de ORDER BY component gebruikt in de classificatiefuncties ROW_NUMBER, RANKen NTILEDENSE_RANK.
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;
Het aantal geretourneerde rijen beperken
Van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.
In de volgende voorbeelden wordt OFFSET het FETCH aantal rijen dat door een query wordt geretourneerd, beperkt.
A. Gehele getallen opgeven voor OFFSET- en FETCH-waarden
In het volgende voorbeeld wordt een geheel getalconstante opgegeven als de waarde voor de OFFSET en FETCH componenten. De eerste query retourneert alle rijen die zijn gesorteerd op de kolom DepartmentID. Vergelijk de resultaten die door deze query worden geretourneerd met de resultaten van de twee query's die erop volgen. De volgende query gebruikt de component OFFSET 5 ROWS om de eerste vijf rijen over te slaan en alle resterende rijen te retourneren. De laatste query maakt gebruik van de component OFFSET 0 ROWS om te beginnen met de eerste rij en gebruikt FETCH NEXT 10 ROWS ONLY vervolgens om de rijen te beperken die worden geretourneerd tot 10 rijen uit de gesorteerde resultatenset.
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. Variabelen opgeven voor OFFSET- en FETCH-waarden
In het volgende voorbeeld worden de variabelen @RowsToSkip gede declareert en @FetchRows worden deze variabelen opgegeven in de OFFSET en FETCH componenten.
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. Expressies opgeven voor OFFSET- en FETCH-waarden
In het volgende voorbeeld wordt de expressie @StartingRowNumber - 1 gebruikt om de OFFSET waarde en de expressie @EndingRowNumber - @StartingRowNumber + 1 op te geven om de FETCH-waarde op te geven. Daarnaast wordt de queryhint OPTIMIZE FORopgegeven. Deze hint kan worden gebruikt om een bepaalde waarde op te geven voor een lokale variabele wanneer de query wordt gecompileerd en geoptimaliseerd. De waarde wordt alleen gebruikt tijdens het optimaliseren van query's en niet tijdens het uitvoeren van query's. Zie Hints voor query's voor meer informatie.
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. Een constante scalaire subquery opgeven voor OFFSET- en FETCH-waarden
In het volgende voorbeeld wordt een constante scalaire subquery gebruikt om de waarde voor de FETCH component te definiëren. De subquery retourneert één waarde uit de kolom PageSize in de tabel dbo.AppSettings.
-- 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. Meerdere query's uitvoeren in één transactie
In het volgende voorbeeld ziet u één methode voor het implementeren van een pagingoplossing die ervoor zorgt dat stabiele resultaten worden geretourneerd in alle aanvragen van de query. De query wordt uitgevoerd in één transactie met behulp van het isolatieniveau van de momentopname en de kolom die in de ORDER BY component is opgegeven, zorgt voor de uniekheid van de kolom.
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
ORDER BY gebruiken met UNION, EXCEPT en INTERSECT
Wanneer een query gebruikmaakt van de UNION, EXCEPTof INTERSECT operators, moet de ORDER BY component worden opgegeven aan het einde van de instructie en worden de resultaten van de gecombineerde query's gesorteerd. Het volgende voorbeeld retourneert alle producten die rood of geel zijn en sorteert deze gecombineerde lijst op de kolom ListPrice.
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;
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
In het volgende voorbeeld ziet u de volgorde van een resultatenset door de numerieke EmployeeKey kolom in oplopende volgorde.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey;
In het volgende voorbeeld wordt een resultatenset gesorteerd op basis van de numerieke EmployeeKey kolom in aflopende volgorde.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey DESC;
In het volgende voorbeeld wordt een resultatenset door de LastName kolom gesorteerd.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName;
In het volgende voorbeeld worden twee kolommen gerangschikt. Deze query sorteert eerst in oplopende volgorde op de FirstName kolom en sorteert vervolgens algemene FirstName waarden in aflopende volgorde op de LastName kolom.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName, FirstName;