Delen via


VOLGENDE WAARDE VOOR (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Genereert een volgnummer uit het opgegeven sequentieobject.

Voor een volledige bespreking van zowel het maken als gebruiken van reeksen, zie Sequentienummers. Gebruik sp_sequence_get_range om een reservebereik van volgnummers te genereren.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

database_name
De naam van de database die het sequentieobject bevat.

schema_name
De naam van het schema dat het sequentieobject bevat.

sequence_name
De naam van het sequentieobject dat het getal genereert.

over_order_by_clause
Bepaalt de volgorde waarin de sequentiewaarde aan de rijen in een partitie wordt toegewezen. Zie OVER-component (Transact-SQL) voor meer informatie.

Retourtypen

Geeft een getal terug met het type van de reeks.

Opmerkingen

De functie NEXT VALUE FOR kan worden gebruikt in opgeslagen procedures en triggers.

Wanneer de functie NEXT VALUE FOR wordt gebruikt in een query of standaardconstraint, als hetzelfde sequentieobject meer dan eens wordt gebruikt, of als hetzelfde sequentieobject zowel in de instructie die de waarden levert, als in een standaardconstraint die wordt uitgevoerd, wordt dezelfde waarde teruggegeven voor alle kolommen die naar dezelfde sequentie verwijzen binnen een rij in de resultaatset.

De functie NEXT VALUE FOR is niet-deterministisch en is alleen toegestaan in contexten waar het aantal gegenereerde sequentiewaarden goed gedefinieerd is. Hieronder volgt de definitie van hoeveel waarden er voor elk verwezen sequentieobject in een gegeven statement worden gebruikt:

  • SELECT - Voor elk gerefereerd sequentieobject wordt één nieuwe waarde per rij gegenereerd in het resultaat van de instructie.

  • INVOEGEN ... VALUES - Voor elk gerefereerd sequentieobject wordt één nieuwe waarde gegenereerd voor elke ingevoegde rij in de stelling.

  • UPDATE - Voor elk gerefereerd sequentieobject wordt voor elke rij die door de instructie wordt bijgewerkt een nieuwe waarde gegenereerd.

  • Procedurele statements (zoals DECLARE,SET, enz.) - Voor elk gerefereerd sequentieobject wordt voor elke statement een nieuwe waarde gegenereerd.

Beperkingen en beperkingen

De functie NEXT VALUE FOR kan niet worden gebruikt in de volgende situaties:

  • Wanneer een database in alleen-lezen-modus staat.

  • Als argument voor een tabelwaardige functie.

  • Als argument voor een aggregatiefunctie.

  • In subqueries, waaronder uitdrukkingen van gemeenschappelijke tabellen en afgeleide tabellen.

  • In views, in door de gebruiker gedefinieerde functies, of in berekende kolommen.

  • In een instructie met de operator DISTINCT, UNION,UNION ALL,EXCEPT of INTERSECT.

  • In een stelling die de ORDER BY-clausule gebruikt, tenzij NEXT VALUE FOR ... OVER (ORDER BY ...) wordt gebruikt.

  • In de volgende clausules: FETCH,OVER,OUTPUT,ON,PIVOT, UNPIVOT,GROUP BY, HAVING,COMPUTE, COMPUTE BY, of FOR XML.

  • In conditionele expressies met CASE,CHOOSE,COALESCE, IIF, ISNULL of NULLIF.

  • In een VALUES-clausule die geen deel uitmaakt van een INSERT-instructie.

  • In de definitie van een controlebeperking.

  • In de definitie van een regel of standaardobject. (Het kan worden gebruikt in een standaardconstraint.)

  • Als standaard in een door de gebruiker gedefinieerd tabeltype.

  • In een instructie met TOP,OFFSET, of wanneer de ROWCOUNT-optie is ingesteld.

  • In de WHERE-clausule van een verklaring.

  • In een MERGE-verklaring . (Behalve wanneer de NEXT VALUE FOR functie wordt gebruikt in een standaardbeperking in de doeltabel en de standaard wordt gebruikt in de CREATE-instructie van de MERGE-instructie .)

Gebruik van een sequentieobject in een standaardconstraint

Bij het gebruik van de functie NEXT VALUE FOR in een standaardbeperking gelden de volgende regels:

  • Een enkel sequentieobject kan worden verwezen vanuit standaardconstraints in meerdere tabellen.

  • De tabel en het sequentieobject moeten zich in dezelfde database bevinden.

  • De gebruiker die de standaardbeperking toevoegt, moet REFERENTIES-rechten hebben op het sequentieobject.

  • Een sequentieobject dat wordt verwezen vanuit een standaardconstraint kan niet worden verwijderd voordat de standaardconstraint is verwijderd.

  • Hetzelfde sequentienummer wordt voor alle kolommen in een rij teruggegeven als meerdere standaardconstraints hetzelfde sequentieobject gebruiken, of als hetzelfde sequentieobject zowel in de instructie die de waarden levert als in een standaardconstraint die wordt uitgevoerd.

  • Verwijzingen naar de functie NEXT VALUE FOR in een standaardconstraint kunnen de OVER-clausule niet specificeren.

  • Een sequentieobject dat in een standaardconstraint wordt genoemd, kan worden gewijzigd.

  • In het geval van een INSERT ... SELECT or-instructie INSERT ... EXEC waarbij de ingevoegde data afkomstig is van een query met een ORDER BY-clausule, worden de waarden die door de NEXT VALUE FOR-functie worden teruggegeven gegenereerd in de volgorde die door de ORDER BY-clausule is gespecificeerd.

Gebruik van een Sequence Object met een OVER ORDER BY Clause

De functie NEXT VALUE FOR ondersteunt het genereren van gesorteerde sequentiewaarden door de OVER-clausule toe te passen op de NEXT VALUE FOR-aanroep. Door gebruik te maken van de OVER-clausule is een gebruiker verzekerd dat de teruggegeven waarden worden gegenereerd in de volgorde van de ORDER BY-subclausule van de OVER-clausule. De volgende aanvullende regels zijn van toepassing bij het gebruik van de functie NEXT VALUE FOR met de OVER-clausule:

  • Meerdere aanroepen van de NEXT VALUE FOR-functie voor dezelfde sequentiegenerator in één enkele instructie moeten allemaal dezelfde OVER-clausuledefinitie gebruiken.

  • Meerdere aanroepen van de NEXT VALUE FOR-functie die verschillende sequentiegeneratoren in één enkele uitspraak verwijzen, kunnen verschillende OVER-clausule definities hebben.

  • Een OVER-clausule toegepast op de functie NEXT VALUE FOR ondersteunt de PARTITION BY-subclausule niet.

  • Als alle aanroepen van de NEXT VALUE FOR-functie in een SELECT-instructie de OVER-clausule specificeren, kan een ORDER BY-clausule worden gebruikt in de SELECT-instructie.

  • De OVER-clausule is toegestaan met de functie NEXT VALUE FOR wanneer deze wordt gebruikt in een SELECT-instructie of INSERT ... SELECT ... -instructie. Het gebruik van de OVER-clausule met de functie NEXT VALUE FOR is niet toegestaan in UPDATE- of MERGE-instructies.

  • Als een ander proces tegelijkertijd toegang heeft tot het sequentieobject, kunnen de teruggegeven getallen gaten hebben.

Metagegevens

Voor informatie over sequenties, raadpleeg de katalogus van sys.sequences .

Security

Permissions

Vereist UPDATE-toestemming voor het sequentieobject of het schema van de sequentie. Voor een voorbeeld van het verlenen van toestemming, zie voorbeeld F later in dit onderwerp.

Eigendomsketening

Sequentieobjecten ondersteunen eigendomsketening. Als het sequentieobject dezelfde eigenaar heeft als de aanroepende opgeslagen procedure, trigger of tabel (met een sequentieobject als standaardconstraint), is er geen permissiecontrole nodig op het sequentieobject. Als het sequentieobject niet eigendom is van dezelfde gebruiker als de aanroepende opgeslagen procedure, trigger of tabel, is een machtigingscontrole vereist op het sequentieobject.

Wanneer de functie NEXT VALUE FOR als standaardwaarde in een tabel wordt gebruikt, hebben gebruikers zowel INSERT-rechten op de tabel als UPDATE-rechten op het sequentieobject nodig om gegevens in te voegen met de standaard.

  • Als de standaardbeperking dezelfde eigenaar heeft als het sequentieobject, zijn er geen rechten vereist op het sequentieobject wanneer de standaardbeperking wordt aangeroepen.

  • Als de standaardbeperking en het sequentieobject niet eigendom zijn van dezelfde gebruiker, zijn permissies vereist voor het sequentieobject, zelfs als het via de standaardbeperking wordt aangeroepen.

Audit

Om de functie NEXT VALUE FOR te auditen, monitor je de SCHEMA_OBJECT_ACCESS_GROUP.

Voorbeelden

Voor voorbeelden van zowel het maken van reeksen als het gebruik van de NEXT VALUE FOR-functie om volgnummers te genereren, zie Volgnummers.

De volgende voorbeelden gebruiken een reeks genaamd CountBy1 in een schema genaamd Test. Voer de volgende instructie uit om de Test.CountBy1 sequentie te maken. Voorbeelden C en E gebruiken de AdventureWorks2025 database, dus de CountBy1 reeks wordt in die database aangemaakt.

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

Eén. Een sequentie gebruiken in een select-instructie

Het volgende voorbeeld creëert een reeks die CountBy1 met één toeneemt elke keer dat deze wordt gebruikt.

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

Hier is het resultatenoverzicht.

FirstUse  
1  
 
SecondUse  
2

B. Een variabele instellen op de volgende reekswaarde

Het volgende voorbeeld laat drie manieren zien om een variabele op de volgende waarde van een volgnummer te zetten.

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. Gebruik van een reeks met een rangschikkingsvensterfunctie

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

D. Gebruik van de functie NEXT VALUE FOR in de definitie van een standaardbeperking

Het gebruik van de functie NEXT VALUE FOR in de definitie van een standaardbeperking wordt ondersteund. Voor een voorbeeld van het gebruik van NEXT VALUE FOR in een CREATE TABLE-instructie , zie Voorbeeld CSequence Numbers. Het volgende voorbeeld gebruikt ALTER TABLE het toevoegen van een reeks als standaard aan een huidige tabel.

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. Gebruik van de functie NEXT VALUE FOR in een INSERT-instructie

Het volgende voorbeeld maakt een tabel aan met de naam TestTable en gebruikt vervolgens de NEXT VALUE FOR functie om een rij in te voegen.

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. Met de functie NEXT VALUE FOR met SELECT ... IN

Het volgende voorbeeld gebruikt de SELECT ... INTO instructie om een tabel te maken met de naam Production.NewLocation en gebruikt de NEXT VALUE FOR functie om elke rij te nummeren.

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. Toestemming verlenen om NEXT VALUE VOOR UIT TE VOEREN

Het volgende voorbeeld geeft UPDATE-toestemming aan een door gebruiker genoemde AdventureWorks\Larry toestemming om uit te voeren NEXT VALUE FOR met behulp van de Test.CounterSeq sequentie.

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

Zie ook

CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL)
reeksnummers