Condividi tramite


Clausola SELECT - ORDER BY (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Ordina i dati restituiti da una query in SQL Server. Utilizzare questa clausola per eseguire le operazioni seguenti:

  • Ordinare il set di risultati di una query in base all'elenco di colonne specificato e, facoltativamente, limitare le righe restituite a un intervallo specificato. L'ordine in cui le righe vengono restituite in un set di risultati non sono garantite a meno che non venga specificata una ORDER BY clausola.

  • Determinare l'ordine in cui i valori della funzione di rango vengono applicati al set di risultati.

Convenzioni relative alla sintassi Transact-SQL

Nota

ORDER BY non è supportato nelle SELECT/INTO istruzioni O CREATE TABLE AS SELECT (CTAS) in Azure Synapse Analytics o in Analytics Platform System (PDW).

Sintassi

Sintassi per SQL Server e database SQL di Azure.

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
    ]
}

Sintassi per Azure Synapse Analytics e Parallel Data Warehouse.

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

order_by_expression

Specifica una colonna o un'espressione sulla quale ordinare il set di risultati della query. Una colonna di ordinamento può essere specificata come un nome o un alias di colonna o un intero non negativo che rappresenta la posizione della colonna nell'elenco di selezione.

È possibile specificare più colonne di ordinamento. I nomi delle colonne devono essere univoci. La sequenza delle colonne di ordinamento nella ORDER BY clausola definisce l'organizzazione del set di risultati ordinato. Ciò significa che il set di risultati viene ordinato in base alla prima colonna e che l'elenco ordinato viene ordinato in base alla seconda colonna e così via.

I nomi di colonna a cui si fa riferimento nella ORDER BY clausola devono corrispondere a una colonna o a un alias di colonna nell'elenco di selezione o a una colonna definita in una tabella specificata nella FROM clausola senza ambiguità. Se la ORDER BY clausola fa riferimento a un alias di colonna dall'elenco di selezione, l'alias di colonna deve essere usato autonomamente e non come parte di un'espressione nella ORDER BY clausola, ad esempio:

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

Specifica che l'operazione ORDER BY deve essere eseguita in base alle regole di confronto specificate in collation_name e non in base alle regole di confronto della colonna, come definito nella tabella o nella vista. Il collation_name può essere un nome delle regole di confronto di Windows o un nome delle regole di confronto SQL. Per ulteriori informazioni, vedere Supporto per Unicode e regole di confronto. COLLATEè applicabile solo per le colonne di tipo char, varchar, nchar e nvarchar.

ASC | DESC

Specifica che i valori nella colonna specificata devono essere ordinati in ordine crescente o decrescente. ASC consente di ordinare i valori dal più piccolo al più grande. DESC consente di ordinare i valori dal più grande al più piccolo. ASC è l'ordinamento predefinito. NULL i valori vengono considerati come i valori più bassi possibili.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

Si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Specifica il numero di righe da ignorare prima della restituzione delle righe dall'espressione di query. Il valore può essere un valore costante intero o un'espressione maggiore o uguale a zero.

offset_row_count_expression può essere una variabile, un parametro o una sottoquery scalare costante. Quando viene usata una sottoquery, non può fare riferimento ad alcuna colonna definita nell'ambito della query esterna. Ovvero, non può essere correlato alla query esterna.

ROW e ROWS sono sinonimi e sono forniti per la compatibilità ANSI.

Nei piani di esecuzione delle query, il valore del conteggio delle righe di offset viene visualizzato nell'attributo Offset dell'operatore TOP di query.

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY

Si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Specifica il numero di righe da restituire dopo l'elaborazione della OFFSET clausola. Il valore può essere un valore costante intero o un'espressione maggiore o uguale a uno.

fetch_row_count_expression può essere una variabile, un parametro o una sottoquery scalare costante. Quando viene usata una sottoquery, non può fare riferimento ad alcuna colonna definita nell'ambito della query esterna. Ovvero, non può essere correlato alla query esterna.

FIRST e NEXT sono sinonimi e sono forniti per la compatibilità ANSI.

ROW e ROWS sono sinonimi e sono forniti per la compatibilità ANSI.

Nei piani di esecuzione delle query, il valore del numero di righe di offset viene visualizzato nell'attributo Rows o Top dell'operatore TOP di query.

Procedure consigliate

Evitare di specificare numeri interi nella ORDER BY clausola come rappresentazioni posizionali delle colonne nell'elenco di selezione. Ad esempio, anche se un'istruzione come SELECT ProductID, Name FROM Production.Production ORDER BY 2 è valida, l'istruzione non è così facilmente comprensibile da altri utenti rispetto alla specifica del nome effettivo della colonna. Inoltre, le modifiche apportate all'elenco di selezione, ad esempio la modifica dell'ordine di colonna o l'aggiunta di nuove colonne, richiedono la modifica della ORDER BY clausola per evitare risultati imprevisti.

In un'istruzione SELECT TOP (<n>) usare sempre una ORDER BY clausola . Questo è l'unico modo per indicare in modo prevedibile quali righe sono interessate da TOP. Per altre informazioni, vedere TOP.

Interoperabilità

Se utilizzata con un'istruzione SELECT...INTO o INSERT...SELECT per inserire righe da un'altra origine, la ORDER BY clausola non garantisce che le righe vengano inserite nell'ordine specificato.

L'uso di OFFSET e FETCH in una visualizzazione non modifica la proprietà aggiornabilità della visualizzazione.

Limiti

Non esiste alcun limite al numero di colonne nella ORDER BY clausola . Tuttavia, le dimensioni totali delle colonne specificate in una ORDER BY clausola non possono superare 8.060 byte.

Le colonne di tipo ntext, text, image, geography, geometry e xml non possono essere usate in una ORDER BY clausola .

Non è possibile specificare un numero intero o una costante quando order_by_expression viene visualizzato in una funzione di classificazione. Per altre informazioni, vedere clausola SELECT - OVER.

Se un nome di tabella è alias nella FROM clausola , è possibile usare solo il nome alias per qualificare le colonne nella ORDER BY clausola .

I nomi di colonna e gli alias specificati nella ORDER BY clausola devono essere definiti nell'elenco di selezione se l'istruzione SELECT contiene una delle clausole o degli operatori seguenti:

  • UNION operatore
  • EXCEPT operatore
  • INTERSECT operatore
  • SELECT DISTINCT

Inoltre, quando l'istruzione include un UNIONoperatore , EXCEPTo INTERSECT , i nomi di colonna o gli alias di colonna devono essere specificati nell'elenco di selezione della prima query (lato sinistro).

In una query che usa UNIONoperatori ORDER BY , EXCEPTo INTERSECT è consentito solo alla fine dell'istruzione. Questa restrizione si applica solo a quando si specifica UNION, EXCEPTe INTERSECT in una query di primo livello e non in una sottoquery. Vedere la sezione Esempi riportata di seguito.

La ORDER BY clausola non è valida nelle viste, nelle funzioni inline, nelle tabelle derivate e nelle sottoquery, a meno che non vengano specificate anche le TOP clausole o OFFSET e FETCH . Quando ORDER BY viene utilizzato in questi oggetti, la clausola viene utilizzata solo per determinare le righe restituite dalla TOP clausola o OFFSET dalle clausole e FETCH . La ORDER BY clausola non garantisce risultati ordinati quando questi costrutti vengono sottoposti a query, a meno che ORDER BY non sia specificato anche nella query stessa.

OFFSET e FETCH non sono supportati nelle viste indicizzate o in una vista definita tramite la CHECK OPTION clausola .

OFFSET e FETCH possono essere usati in qualsiasi query che consenta TOP e ORDER BY con le limitazioni seguenti:

  • La OVER clausola non supporta OFFSET e FETCH.

  • OFFSETe FETCH non possono essere specificati direttamente nelle INSERTistruzioni , UPDATEMERGE, e DELETE , ma possono essere specificate in una sottoquery definita in queste istruzioni. Ad esempio, nell'istruzione INSERT INTO SELECT OFFSET e FETCH può essere specificato nell'istruzione SELECT .

  • In una query che usa UNIONoperatori OFFSET o EXCEPT INTERSECT e FETCH può essere specificata solo nella query finale che specifica l'ordine dei risultati della query.

  • TOP non può essere combinato con OFFSET e FETCH nella stessa espressione di query (nello stesso ambito di query).

Usare OFFSET e FETCH per limitare le righe restituite

È consigliabile usare le OFFSET clausole e FETCH anziché la TOP clausola per implementare una soluzione di paging di query e limitare il numero di righe inviate a un'applicazione client.

L'uso di OFFSET e FETCH come soluzione di paging richiede l'esecuzione della query una sola volta per ogni pagina di dati restituita all'applicazione client. Ad esempio, per restituire i risultati di una query con incrementi di 10 righe, è necessario eseguire la query una volta per restituire le righe da 1 a 10 e quindi eseguire di nuovo la query per restituire le righe da 11 a 20 e così via. Ogni query è indipendente e non correlata in alcun modo all'altra. Ciò significa che, contrariamente all'utilizzo di un cursore in cui viene eseguita la query e lo stato viene gestito nel server, l'applicazione client è responsabile del rilevamento dello stato. Per ottenere risultati stabili tra le richieste di query che usano OFFSET e FETCH, è necessario soddisfare le condizioni seguenti:

  1. I dati sottostanti utilizzati dalla query non devono cambiare. Ovvero, le righe interessate dalla query non vengono aggiornate o tutte le richieste di pagine della query vengono eseguite in una singola transazione usando l'isolamento delle transazioni snapshot o serializzabile. Per altre informazioni su questi livelli di isolamento delle transazioni, vedere SET TRANSACTION ISOLATION LEVEL.

  2. La ORDER BY clausola contiene una colonna o una combinazione di colonne che sono sicuramente univoche.

Vedere l'esempio "Esecuzione di più query in una singola transazione" nella sezione Esempi più avanti in questo articolo.

Se i piani di esecuzione coerenti sono importanti nella soluzione di paging, è consigliabile usare l'hint OPTIMIZE FOR per la query per i OFFSET parametri e FETCH . Vedere Specificare espressioni per i valori OFFSET e FETCH nella sezione Esempi più avanti in questo articolo. Per altre informazioni su OPTIMIZE FOR, vedere Hint di query.

Esempi

Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022 o AdventureWorksDW2022, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.

Categoria Elementi di sintassi inclusi
Sintassi di base ORDER BY
Specificare l'ordine crescente e decrescente DESC oppure ASC
Specificare le regole di confronto COLLATE
Specificare un ordine condizionale Espressione CASE
Usare ORDER BY in una funzione di classificazione Funzioni di rango
Limitare il numero di righe restituite OFFSET e FETCH
Usare ORDER BY con UNION, EXCEPT e INTERSECT UNION

Sintassi di base

Gli esempi in questa sezione illustrano le funzionalità di base della ORDER BY clausola usando la sintassi minima richiesta.

R. Specificare una singola colonna definita nell'elenco di selezione

Nell'esempio seguente il set di risultati viene ordinato in base alla colonna ProductID numerica. Poiché non viene specificato un ordinamento specifico, viene usato il valore predefinito (ordine crescente).

USE AdventureWorks2022;
GO

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

B. Specificare una colonna non definita nell'elenco di selezione

Nell'esempio seguente il set di risultati viene ordinato da una colonna non inclusa nell'elenco di selezione, ma definita nella tabella specificata nella FROM clausola .

USE AdventureWorks2022;
GO

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

C. Specificare un alias come colonna di ordinamento

Nell'esempio seguente l'alias della colonna SchemaName viene specificato come colonna di ordinamento.

USE AdventureWorks2022;
GO

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

D. Specificare un'espressione come colonna di ordinamento

Nell'esempio seguente viene utilizzata un'espressione come colonna di ordinamento. L'espressione viene definita usando la DATEPART funzione per ordinare il set di risultati in base all'anno in cui sono stati assunti i dipendenti.

USE AdventureWorks2022;
GO

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

Specificare l'ordinamento crescente e decrescente

R. Specificare un ordine decrescente

Nell'esempio seguente il set di risultati viene ordinato in base alla colonna numerica ProductID in ordine decrescente.

USE AdventureWorks2022;
GO

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

B. Specificare un ordine crescente

Nell'esempio seguente il set di risultati viene ordinato in base alla colonna Name in ordine crescente. I caratteri sono ordinati alfabeticamente, non numericamente. Di conseguenza, 10 precede 2.

USE AdventureWorks2022;
GO

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

C. Specificare l'ordine crescente e decrescente

Nell'esempio seguente il set di risultati viene ordinato in base a due colonne. Il set di risultati della query viene ordinato prima in ordine crescente in base alla colonna FirstName e quindi in ordine decrescente in base alla colonna LastName.

USE AdventureWorks2022;
GO

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

Specificare le regole di confronto

Nell'esempio seguente viene illustrato come specificare regole di confronto nella ORDER BY clausola può modificare l'ordine in cui vengono restituiti i risultati della query. Viene creata una tabella contenente una colonna definita tramite regole di confronto che non fanno distinzione tra maiuscole e minuscole e tra i vari accenti. I valori vengono inseriti con varie differenze tra maiuscole e minuscole e accentate. Poiché non sono specificate regole di confronto nella ORDER BY clausola , la prima query usa le regole di confronto della colonna durante l'ordinamento dei valori. Nella seconda query, nella clausola viene specificata ORDER BY una regola di confronto con distinzione tra maiuscole e minuscole, che modifica l'ordine in cui vengono restituite le righe.

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;

Specificare un ordine condizionale

Negli esempi seguenti viene usata l'espressione CASE in una ORDER BY clausola per determinare in modo condizionale l'ordinamento delle righe in base a un determinato valore di colonna. Nel primo esempio, viene calcolato il valore nella colonna SalariedFlag della tabella HumanResources.Employee. I dipendenti per cui SalariedFlag è impostato su 1 vengono restituiti in ordine decrescente in base a BusinessEntityID. I dipendenti per cui SalariedFlag è impostato su 0 vengono restituiti in ordine crescente in base a BusinessEntityID. Nel secondo esempio il set di risultati viene ordinato in base alla colonna TerritoryName quando la colonna CountryRegionName è uguale a 'Stati Uniti' e in base a CountryRegionName per tutte le altre righe.

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;

Usare ORDER BY in una funzione di classificazione

Nell'esempio seguente viene usata la ORDER BY clausola nelle funzioni ROW_NUMBERdi classificazione , , RANKDENSE_RANKe 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;

Limitare il numero di righe restituite

Si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Gli esempi seguenti usano OFFSET e FETCH per limitare il numero di righe restituite da una query.

R. Specificare le costanti integer per i valori OFFSET e FETCH

Nell'esempio seguente viene specificata una costante integer come valore per le OFFSET clausole e FETCH . La prima query restituisce tutte le righe ordinate in base alla colonna DepartmentID. Confrontare i risultati restituiti da questa query ai risultati delle due query che la seguono. La query successiva usa la clausola OFFSET 5 ROWS per ignorare le prime cinque righe e restituire tutte le righe rimanenti. Nella query finale viene utilizzata la clausola OFFSET 0 ROWS per iniziare con la prima riga, quindi FETCH NEXT 10 ROWS ONLY per limitare le righe restituite a 10 righe dal set di risultati ordinato.

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. Specificare le variabili per i valori OFFSET e FETCH

Nell'esempio seguente vengono dichiarate le variabili @RowsToSkip e @FetchRows vengono specificate nelle OFFSET clausole e FETCH .

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. Specificare le espressioni per i valori OFFSET e FETCH

Nell'esempio seguente viene utilizzata l'espressione @StartingRowNumber - 1 per specificare il OFFSET valore e l'espressione @EndingRowNumber - @StartingRowNumber + 1 per specificare il valore FETCH. Viene inoltre specificato l'hint per la query , OPTIMIZE FOR. Questo hint può essere utilizzato per specificare un valore per una variabile locale quando la query viene compilata e ottimizzata. Il valore viene utilizzato solo durante l'ottimizzazione della query e non durante l'esecuzione. Per altre informazioni, vedere Hint per la query.

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. Specificare una sottoquery scalare costante per i valori OFFSET e FETCH

Nell'esempio seguente viene utilizzata una sottoquery scalare costante per definire il valore per la FETCH clausola . La sottoquery restituisce un singolo valore dalla colonna PageSize nella tabella 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. Eseguire più query in una singola transazione

Nell'esempio seguente viene illustrato un metodo per l'implementazione di una soluzione di paging che garantisca la restituzione di risultati stabili in tutte le richieste dalla query. La query viene eseguita in una singola transazione usando il livello di isolamento dello snapshot e la colonna specificata nella clausola garantisce l'univocità della ORDER BY colonna.

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

Usare ORDER BY con UNION, EXCEPT e INTERSECT

Quando una query usa gli UNIONoperatori , EXCEPTo INTERSECT , la ORDER BY clausola deve essere specificata alla fine dell'istruzione e i risultati delle query combinate vengono ordinati. Nell'esempio seguente vengono restituiti tutti i prodotti rossi o gialli e questo elenco combinato viene ordinato in base alla colonna 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;

Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)

Nell'esempio seguente viene illustrato l'ordinamento di un set di risultati in base alla colonna EmployeeKey numerica in ordine crescente.

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

Nell'esempio seguente un set di risultati viene ordinato in base alla colonna numerica EmployeeKey in ordine decrescente.

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

Nell'esempio seguente il set di risultati viene ordinato in base alla colonna LastName.

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

Nell'esempio seguente l'ordinamento viene fatto in base a due colonne. Questa query esegue l'ordinamento crescente in base alla colonna FirstName, quindi esegue un ordinamento decrescente dei valori FirstName comuni in base alla colonna LastName.

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