Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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 ... SELECTellerINSERT ... EXECsats 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-klausulen på anropet 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