NÄSTA VÄRDE FÖR (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Genererar ett sekvensnummer från det angivna sekvensobjektet.

För en fullständig diskussion om både skapande och användning av sekvenser, se Sekvensnummer. Använd sp_sequence_get_range för att generera reserver av ett intervall av sekvensnummer.

Transact-SQL syntaxkonventioner

Syntax

NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name  
   [ OVER (<over_order_by_clause>) ]  

Arguments

database_name
Namnet på databasen som innehåller sekvensobjektet.

schema_name
Namnet på schemat som innehåller sekvensobjektet.

sequence_name
Namnet på sekvensobjektet som genererar talet.

over_order_by_clause
Bestämmer i vilken ordning sekvensvärdet tilldelas raderna i en partition. Mer information finns i OVER-satsen (Transact-SQL).

Returtyper

Returnerar ett tal med typen av sekvensen.

Anmärkningar

Funktionen NEXT VALUE FOR kan användas i lagrade procedurer och triggers.

När funktionen NEXT VALUE FOR används i en fråga eller standardbegränsning, om samma sekvensobjekt används mer än en gång, eller om samma sekvensobjekt används både i satsen som tillhandahåller värdena och i en standardbegränsning som exekveras, kommer samma värde att returneras för alla kolumner som refererar till samma sekvens inom en rad i resultatuppsättningen.

Funktionen NEXT VALUE FOR är icke-deterministisk och tillåts endast i sammanhang där antalet genererade sekvensvärden är väldefinierat. Nedan följer definitionen av hur många värden som kommer att användas för varje refererat sekvensobjekt i ett givet påstående:

  • SELECT - För varje refererat sekvensobjekt genereras ett nytt värde en gång per rad i resultatet av satsen.

  • INFOGA ... VALUES - För varje refererat sekvensobjekt genereras ett nytt värde en gång för varje insatta rad i satsen.

  • UPDATE – För varje refererat sekvensobjekt genereras ett nytt värde för varje rad som uppdateras av satsen.

  • Procedurmässiga satser (såsom DEKLARATION,SET, etc.) – För varje refererat sekvensobjekt genereras ett nytt värde för varje sats.

Begränsningar och restriktioner

Funktionen NEXT VALUE FOR kan inte användas i följande situationer:

  • När en databas är i skrivskyddat läge.

  • Som ett argument till en tabellvärd funktion.

  • Som ett argument till en aggregerad funktion.

  • I delfrågor inklusive vanliga tabelluttryck och härledda tabeller.

  • I vyer, i användardefinierade funktioner eller i beräknade kolumner.

  • I en sats som använder operatorn DISTINCT, UNION,UNION ALL,EXCEPT eller INTERSECT.

  • I ett uttalande som använder ORDER BY-klausulen om inte NEXT VALUE FOR ... ÖVER (ORDER BY ...) används.

  • I följande klausuler: FETCH,OVER,OUTPUT,ON,PIVOT, UNPIVOT,GROUP BY, HAVING,COMPUTE, COMPUTE BY eller FOR XML.

  • I villkorliga uttryck som använder CASE,CHOOSE,COALESCE, IIF, ISNULL eller NULLIF.

  • I en VALUES-klausul som inte är en del av ett INSERT-uttalande .

  • I definitionen av en kontrollbegränsning.

  • I definitionen av en regel eller standardobjekt. (Den kan användas i en standardbegränsning.)

  • Som standard i en användardefinierad tabelltyp.

  • I en sats som använder TOP,OFFSET, eller när alternativet ROWCOUNT är satt.

  • I WHERE-klausulen i ett påstående.

  • I ett MERGE-uttalande . (Förutom när funktionen NEXT VALUE FOR används i en standardbegränsning i måltabellen och standard används i CREATE-satsen i MERGE-satsen .)

Att använda ett sekvensobjekt i en standardbegränsning

När man använder funktionen NEXT VALUE FOR i en standardbegränsning gäller följande regler:

  • Ett enda sekvensobjekt kan refereras från standardbegränsningar i flera tabeller.

  • Tabellen och sekvensobjektet måste finnas i samma databas.

  • Användaren som lägger till standardbegränsningen måste ha REFERENS-behörighet på sekvensobjektet.

  • Ett sekvensobjekt som refereras från en standardbegränsning kan inte tas bort innan standardbegränsningen har tagits bort.

  • Samma sekvensnummer returneras för alla kolumner i rad om flera standardbegränsningar använder samma sekvensobjekt, eller om samma sekvensobjekt används både i satsen som tillhandahåller värdena och i en standardbegränsning som exekveras.

  • Referenser till funktionen NEXT VALUE FOR i en standardbegränsning kan inte specificera OVER-klausulen.

  • Ett sekvensobjekt som refereras i en standardbegränsning kan ändras.

  • I fallet med en INSERT ... SELECT eller INSERT ... EXEC sats där datan som infogas kommer från en fråga med en ORDER BY-klausul , kommer de värden som returneras av funktionen NEXT VALUE FOR att genereras i den ordning som anges av ORDER BY-klausulen .

Att använda ett sekvensobjekt med en ÖVERORDNING EFTER Klausul

Funktionen NEXT VALUE FOR stödjer generering av sorterade sekvensvärden genom att applicera OVER-klausulenanropet NEXT VALUE FOR. Genom att använda OVER-klausulen garanteras användaren att de värden som returneras genereras i ordningen för OVER-klausulensORDER BY-undersats . Följande tilläggsregler gäller när man använder funktionen NEXT VALUE FOR med OVER-klausulen:

  • Flera anrop till funktionen NEXT VALUE FOR för samma sekvensgenerator i en enda sats måste alla använda samma OVER-klausuldefinition .

  • Flera anrop till funktionen NEXT VALUE FOR som refererar till olika sekvensgeneratorer i en och samma sats kan ha olika definitioner av OVER-klausulen .

  • En OVER-sats som appliceras på funktionen NEXT VALUE FOR stöder inte underklausulen PARTITION BY .

  • Om alla anrop till funktionen NEXT VALUE FOR i en SELECT-sats specificerar OVER-klausulen , kan en ORDER BY-klausul användas i SELECT-satsen .

  • OVER-klausulen tillåts tillsammans med funktionen NEXT VALUE FOR när den används i ett SELECT-uttalande eller INSERT ... SELECT ... -sats. Användning av OVER-klausulen med funktionen NEXT VALUE FOR är inte tillåten i UPDATE- eller MERGE-satser .

  • Om en annan process samtidigt använder sekvensobjektet kan de returnerade siffrorna ha luckor.

Metainformation

För information om sekvenser, sök i sys.sequences katalogvy.

Security

Permissions

Kräver UPDATE-behörighet på sekvensobjektet eller schemat för sekvensen. För ett exempel på att bevilja tillstånd, se exempel F senare i detta ämne.

Ägarkedja

Sekvensobjekt stödjer ägandekedja. Om sekvensobjektet har samma ägare som den anropande lagrade proceduren, triggern eller tabellen (med ett sekvensobjekt som standardbegränsning), krävs ingen behörighetskontroll på sekvensobjektet. Om sekvensobjektet inte ägs av samma användare som den anropande lagrade proceduren, triggern eller tabellen krävs en behörighetskontroll på sekvensobjektet.

När funktionen NEXT VALUE FOR används som standardvärde i en tabell kräver användare både INSERT-behörighet på tabellen och UPDATE-behörighet på sekvensobjektet för att infoga data med standard.

  • Om standardbegränsningen har samma ägare som sekvensobjektet krävs inga behörigheter på sekvensobjektet när standardbegränsningen anropas.

  • Om standardbegränsningen och sekvensobjektet inte ägs av samma användare krävs behörigheter på sekvensobjektet även om det anropas via standardbegränsningen.

Audit

För att granska funktionen NEXT VALUE FOR , övervaka SCHEMA_OBJECT_ACCESS_GROUP.

Examples

För exempel på både att skapa sekvenser och använda funktionen NEXT VALUE FOR för att generera sekvensnummer, se Sekvensnummer.

Följande exempel använder en sekvens som är namngiven CountBy1 i ett schema med namnet Test. Exekverar följande sats för att skapa sekvensen Test.CountBy1 . Exempel C och E använder databasen AdventureWorks2025 , så sekvensen CountBy1 skapas i den databasen.

USE AdventureWorks2022;  
GO  
  
CREATE SCHEMA Test;  
GO  
  
CREATE SEQUENCE Test.CountBy1  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

A. Att använda en sekvens i en select-sats

Följande exempel skapar en sekvens som heter CountBy1 och ökar med ett varje gång den används.

SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;  
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;  

Här är resultatet.

FirstUse  
1  
 
SecondUse  
2

B. Att sätta en variabel till nästa sekvensvärde

Följande exempel visar tre sätt att sätta en variabel till nästa värde i ett sekvensnummer.

DECLARE @myvar1 BIGINT = NEXT VALUE FOR Test.CountBy1  
DECLARE @myvar2 BIGINT ;  
DECLARE @myvar3 BIGINT ;  
SET @myvar2 = NEXT VALUE FOR Test.CountBy1 ;  
SELECT @myvar3 = NEXT VALUE FOR Test.CountBy1 ;  
SELECT @myvar1 AS myvar1, @myvar2 AS myvar2, @myvar3 AS myvar3 ;  
GO  

C. Att använda en sekvens med en rangordningsfönsterfunktion

USE AdventureWorks2022;  
GO  
  
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,  
    FirstName, LastName  
FROM Person.Contact ;  
GO  

D. Att använda funktionen NEXT VALUE FOR i definitionen av en standardbegränsning

Att använda funktionen NEXT VALUE FOR i definitionen av en standardbegränsning stöds. För ett exempel på att använda NEXT VALUE FOR i en CREATE TABLE-sats , se Exempel Csekvensnummer. Följande exempel använder ALTER TABLE för att lägga till en sekvens som standard i en aktuell tabell.

CREATE TABLE Test.MyTable  
(  
    IDColumn NVARCHAR(25) PRIMARY KEY,  
    name VARCHAR(25) NOT NULL  
) ;  
GO  
  
CREATE SEQUENCE Test.CounterSeq  
    AS INT  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  
  
ALTER TABLE Test.MyTable  
    ADD   
        DEFAULT N'AdvWorks_' +   
        CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20))   
        FOR IDColumn;  
GO  
  
INSERT Test.MyTable (name)  
VALUES ('Larry') ;  
GO  
  
SELECT * FROM Test.MyTable;  
GO  

E. Att använda funktionen NEXT VALUE FOR i en INSERT-sats

Följande exempel skapar en tabell med namnet TestTable och använder NEXT VALUE FOR sedan funktionen för att infoga en rad.

CREATE TABLE Test.TestTable  
     (CounterColumn INT PRIMARY KEY,  
    Name NVARCHAR(25) NOT NULL) ;   
GO  
  
INSERT Test.TestTable (CounterColumn,Name)  
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Syed') ;  
GO  
  
SELECT * FROM Test.TestTable;   
GO  

E. Med funktionen NEXT VALUE FOR med SELECT ... IN

Följande exempel använder satsen SELECT ... INTO för att skapa en tabell med namnet Production.NewLocation och använder NEXT VALUE FOR funktionen för att numrera varje rad.

USE AdventureWorks2022;   
GO  
  
SELECT NEXT VALUE FOR Test.CountBy1 AS LocNumber, Name   
    INTO Production.NewLocation  
    FROM Production.Location ;  
GO  
  
SELECT * FROM Production.NewLocation ;  
GO  

F. Beviljar behörighet att köra NEXT VALUE FÖR

Följande exempel ger UPDATE-behörighet till en användare med namnet AdventureWorks\Larry behörighet att köra NEXT VALUE FOR med sekvensen Test.CounterSeq .

GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;  

Se även

SKAPA SEKVENS (Transact-SQL)
ALTER SEKVENS (Transact-SQL)
sekvensnummer