NEXT VALUE FOR (Transact-SQL)NEXT VALUE FOR (Transact-SQL)

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Generiert eine Sequenznummer aus dem angegebenen Sequenzobjekt.Generates a sequence number from the specified sequence object.

Eine umfassende Erläuterung der Erstellung und Verwendung von Sequenzen finden Sie unter Sequenznummern.For a complete discussion of both creating and using sequences, see Sequence Numbers. Mit sp_sequence_get_range können Sie einen Bereich von Sequenznummern reservieren.Use sp_sequence_get_range to generate reserve a range of sequence numbers.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

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

ArgumenteArguments

database_namedatabase_name
Der Name der Datenbank mit dem Sequenzobjekt.The name of the database that contains the sequence object.

schema_nameschema_name
Der Name des Schemas mit dem Sequenzobjekt.The name of the schema that contains the sequence object.

sequence_namesequence_name
Der Name des Sequenzobjekts, von dem die Nummer generiert wird.The name of the sequence object that generates the number.

over_order_by_clauseover_order_by_clause
Bestimmt die Reihenfolge, in der der Sequenzwert den Zeilen in einer Partition zugewiesen wird.Determines the order in which the sequence value is assigned to the rows in a partition. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

RückgabetypenReturn Types

Gibt mit dem Typ der Sequenz eine Nummer zurück.Returns a number using the type of the sequence.

BemerkungenRemarks

Die NEXT VALUE FOR-Funktion kann in gespeicherten Prozeduren und Triggern verwendet werden.The NEXT VALUE FOR function can be used in stored procedures and triggers.

Wird bei Verwendung der NEXT VALUE FOR-Funktion in einer Abfrage oder Standardeinschränkung das gleiche Sequenzobjekt mehr als einmal verwendet oder das gleiche Sequenzobjekt sowohl in der Anweisung, die die Werte angibt, als auch in einer ausgeführten Standardeinschränkung verwendet, wird der gleiche Wert für alle Spalten zurückgegeben, die in einer Zeile im Resultset auf die gleiche Sequenz verweisen.When the NEXT VALUE FOR function is used in a query or default constraint, if the same sequence object is used more than once, or if the same sequence object is used both in the statement supplying the values, and in a default constraint being executed, the same value will be returned for all columns referencing the same sequence within a row in the result set.

Die NEXT VALUE FOR-Funktion ist nicht deterministisch und nur in Kontexten zulässig, in denen die Anzahl der generierten Sequenzwerte exakt definiert ist.The NEXT VALUE FOR function is nondeterministic, and is only allowed in contexts where the number of generated sequence values is well defined. Nachfolgend finden Sie eine Definition der Anzahl der Werte, die für das jeweilige Sequenzobjekt, auf das verwiesen wird, in einer Anweisung verwendet werden:Below is the definition of how many values will be used for each referenced sequence object in a given statement:

  • SELECT: Für jedes Sequenzobjekt, auf das verwiesen wird, wird im Ergebnis der Anweisung einmal pro Zeile ein neuer Wert generiert.SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERT ... VALUES: Für jedes Sequenzobjekt, auf das verwiesen wird, wird in der Anweisung einmal pro eingefügte Zeile ein neuer Wert generiert.INSERT ... VALUES - For each referenced sequence object, a new value is generated once for each inserted row in the statement.

  • UPDATE: Für jedes Sequenzobjekt, auf das verwiesen wird, wird ein neuer Wert für jede Zeile generiert, die von der Anweisung aktualisiert wird.UPDATE - For each referenced sequence object, a new value is generated for each row being updated by the statement.

  • Verfahrensanweisungen (beispielsweise DECLARE, SET, usw.): Für jedes Sequenzobjekt, auf das verwiesen wird, wird eine neuer Wert für jede Anweisung generiert.Procedural statements (such as DECLARE, SET, etc.) - For each referenced sequence object, a new value is generated for each statement.

EinschränkungenLimitations and Restrictions

Die NEXT VALUE FOR-Funktion kann in den folgenden Situationen nicht verwendet werden:The NEXT VALUE FOR function cannot be used in the following situations:

  • Bei Datenbanken im schreibgeschützten ModusWhen a database is in read-only mode.

  • Bei Argumenten für eine TabellenwertfunktionAs an argument to a table-valued function.

  • Bei Argumenten für eine AggregatfunktionAs an argument to an aggregate function.

  • Bei Unterabfragen einschließlich allgemeiner Tabellenausdrücke und abgeleiteter TabellenIn subqueries including common table expressions and derived tables.

  • Bei Sichten, in benutzerdefinierten Funktionen oder in berechneten SpaltenIn views, in user-defined functions, or in computed columns.

  • Bei Anweisungen, die den Operator DISTINCT, UNION, UNION ALL, EXCEPT oder INTERSECT verwenden.In a statement using the DISTINCT, UNION, UNION ALL, EXCEPT or INTERSECT operator.

  • Bei Anweisungen, die die ORDER BY-Klausel verwenden, es sei denn, NEXT VALUE FOR ... OVER (ORDER BY …) wird verwendet.In a statement using the ORDER BY clause unless NEXT VALUE FOR ... OVER (ORDER BY ...) is used.

  • Bei den folgenden Klauseln: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY oder FOR XML.In the following clauses: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY, or FOR XML.

  • Bei bedingten Ausdrücken mit CASE, CHOOSE, COALESCE, IIF, ISNULL oder NULLIF.In conditional expressions using CASE, CHOOSE, COALESCE, IIF, ISNULL, or NULLIF.

  • Bei einer VALUES-Klausel, die nicht Teil einer INSERT-Anweisung ist.In a VALUES clause that is not part of an INSERT statement.

  • Bei der Definition einer CHECK-EinschränkungIn the definition of a check constraint.

  • Bei der Definition einer Regel oder eines Standardobjekts.In the definition of a rule or default object. (Die Verwendung in einer Standardeinschränkung ist möglich.)(It can be used in a default constraint.)

  • Als Standard in einem benutzerdefinierten Tabellentyp.As a default in a user-defined table type.

  • In einer Anweisung mit TOP, OFFSET oder wenn die ROWCOUNT-Option festgelegt ist.In a statement using TOP, OFFSET, or when the ROWCOUNT option is set.

  • In der WHERE-Klausel einer Anweisung.In the WHERE clause of a statement.

  • In einer MERGE-Anweisung.In a MERGE statement. (Ausnahme: Wenn die NEXT VALUE FOR-Funktion in einer Standardeinschränkung in der Zieltabelle und in der CREATE-Anweisung der MERGE-Anweisung der Standardwert verwendet wird.)(Except when the NEXT VALUE FOR function is used in a default constraint in the target table and default is used in the CREATE statement of the MERGE statement.)

Verwenden eines Sequenzobjekts in einer StandardeinschränkungUsing a Sequence Object in a Default Constraint

Wenn Sie die NEXT VALUE FOR-Funktion in einer Standardeinschränkung verwenden, gelten die folgenden Regeln:When using the NEXT VALUE FOR function in a default constraint, the following rules apply:

  • Standardeinschränkungen in mehreren Tabellen können auf ein einzelnes Sequenzobjekt verweisen.A single sequence object may be referenced from default constraints in multiple tables.

  • Die Tabelle und das Sequenzobjekt müssen sich in der gleichen Datenbank befinden.The table and the sequence object must reside in the same database.

  • Der Benutzer, der die Standardeinschränkung hinzufügt, muss über die REFERENCES-Berechtigung für das Sequenzobjekt verfügen.The user adding the default constraint must have REFERENCES permission on the sequence object.

  • Ein Sequenzobjekt, auf das von einer Standardeinschränkung verwiesen wird, kann nicht gelöscht werden, bevor nicht die Standardeinschränkung gelöscht wurde.A sequence object that is referenced from a default constraint cannot be dropped before the default constraint is dropped.

  • Wenn mehrere Standardeinschränkungen das gleiche Sequenzobjekt verwenden, oder wenn das gleiche Sequenzobjekt sowohl in der Anweisung verwendet wird, die die Werte angibt, als auch in einer Standardeinschränkung, die ausgeführt wird, wird die gleiche Sequenznummer für alle Spalten in einer Zeile zurückgegeben.The same sequence number is returned for all columns in a row if multiple default constraints use the same sequence object, or if the same sequence object is used both in the statement supplying the values, and in a default constraint being executed.

  • Verweise auf die NEXT VALUE FOR-Funktion in einer Standardeinschränkung können keine OVER-Klausel angeben.References to the NEXT VALUE FOR function in a default constraint cannot specify the OVER clause.

  • Ein Sequenzobjekt, auf das in einer Standardeinschränkung verwiesen wird, kann geändert werden.A sequence object that is referenced in a default constraint can be altered.

  • Bei einer INSERT ... SELECT- oder INSERT ... EXEC-Anweisung, bei der die eingefügten Daten aus einer Abfrage mit einer ORDER BY-Klausel stammen, werden die von der NEXT VALUE FOR-Funktion zurückgegebenen Werte in der von der ORDER BY-Klausel angegebenen Reihenfolge generiert.In the case of an INSERT ... SELECT or INSERT ... EXEC statement where the data being inserted comes from a query using an ORDER BY clause, the values being returned by the NEXT VALUE FOR function will be generated in the order specified by the ORDER BY clause.

Verwenden eines Sequenzobjekts mit einer OVER ORDER BY-KlauselUsing a Sequence Object with an OVER ORDER BY Clause

Die NEXT VALUE FOR-Funktion unterstützt das Generieren von sortierten Sequenzwerten durch Verwenden der OVER-Klausel für den NEXT VALUE FOR-Aufruf.The NEXT VALUE FOR function supports generating sorted sequence values by applying the OVER clause to the NEXT VALUE FOR call. Die Verwendung der OVER-Klausel garantiert dem Benutzer, dass die zurückgegebenen Werte in der Reihenfolge generiert werden, die von der ORDER BY-Unterklausel der OVER-Klausel festgelegt wird.By using the OVER clause, a user is guaranteed that the values being returned are generated in the order of the OVER clause's ORDER BY subclause. Die Verwendung der NEXT VALUE FOR-Funktion mit der OVER-Klausel unterliegt folgenden zusätzlichen Regeln:The following additional rules apply when using the NEXT VALUE FOR function with the OVER clause:

  • Mehrere Aufrufe der NEXT VALUE FOR-Funktion für den gleichen Sequenzgenerator in einer einzelnen Anweisung müssen jeweils die gleiche OVER-Klauseldefinition verwenden.Multiple calls to the NEXT VALUE FOR function for the same sequence generator in a single statement must all use the same OVER clause definition.

  • Mehrere Aufrufe der NEXT VALUE FOR-Funktion, die auf unterschiedliche Sequenzgeneratoren in einer einzelnen Anweisung verweisen, können verschiedene OVER-Klauseldefinitionen aufweisen.Multiple calls to the NEXT VALUE FOR function that reference different sequence generators in a single statement can have different OVER clause definitions.

  • Eine OVER-Klausel, die auf die NEXT VALUE FOR-Funktion angewendet wird, unterstützt keine PARTITION BY-Unterklausel.An OVER clause applied to the NEXT VALUE FOR function does not support the PARTITION BY sub clause.

  • Wenn alle Aufrufe der NEXT VALUE FOR-Funktion in einer SELECT-Anweisung die OVER-Klausel angeben, kann eine ORDER BY-Klausel in der SELECT-Anweisung verwendet werden.If all calls to the NEXT VALUE FOR function in a SELECT statement specifies the OVER clause, an ORDER BY clause may be used in the SELECT statement.

  • Die OVER-Klausel kann mit der NEXT VALUE FOR-Funktion in einer SELECT-Anweisung oder in einer INSERT ... SELECT ...-Anweisung verwendet werden.The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT ... SELECT ... statement. Das Verwenden der OVER-Klausel mit der NEXT VALUE FOR-Funktion ist in UPDATE- oder MERGE-Anweisungen nicht zulässig.Use of the OVER clause with the NEXT VALUE FOR function is not allowed in UPDATE or MERGE statements.

  • Wenn ein anderer Prozess zur gleichen Zeit auf das Sequenzobjekt zugreift, weisen die zurückgegebenen Zahlen möglicherweise Lücken auf.If another process is accessing the sequence object at the same time, the numbers returned could have gaps.

MetadatenMetadata

Fragen Sie die sys.sequences-Katalogsicht ab, um Informationen zu Sequenzen zu erhalten.For information about sequences, query the sys.sequences catalog view.

SicherheitSecurity

BerechtigungenPermissions

Erfordert die UPDATE-Berechtigung für das Sequenzobjekt oder das Schema der Sequenz.Requires UPDATE permission on the sequence object or the schema of the sequence. Ein Beispiel für das Gewähren der Berechtigung finden Sie weiter unten in diesem Thema in Beispiel F.For an example of granting permission, see example F later in this topic.

BesitzverkettungOwnership Chaining

Sequenzobjekte unterstützen die Besitzverkettung.Sequence objects support ownership chaining. Wenn das Sequenzobjekt über den gleichen Besitzer wie die aufrufende gespeicherte Prozedur, der aufrufende Trigger oder die aufrufende Tabelle (mit einem Sequenzobjekt als Standardeinschränkung) verfügt, ist keine Überprüfung der Berechtigung für das Sequenzobjekt erforderlich.If the sequence object has the same owner as the calling stored procedure, trigger, or table (having a sequence object as a default constraint), no permission check is required on the sequence object. Wenn das Sequenzobjekt nicht im Besitz des gleichen Benutzers wie die aufrufende gespeicherte Prozedur, der aufrufende gespeicherte Trigger oder die aufrufende gespeicherte Tabelle ist, muss die Berechtigung für das Sequenzobjekt überprüft werden.If the sequence object is not owned by the same user as the calling stored procedure, trigger, or table, a permission check is required on the sequence object.

Wenn die NEXT VALUE FOR-Funktion als Standardwert in einer Tabelle verwendet wird, benötigen Benutzer eine INSERT-Berechtigung für die Tabelle sowie eine UPDATE-Berechtigung für das Sequenzobjekt, um Daten mithilfe der Standardeinstellung hinzuzufügen.When the NEXT VALUE FOR function is used as a default value in a table, users require both INSERT permission on the table, and UPDATE permission on the sequence object, to insert data using the default.

  • Wenn die Standardeinschränkung den gleichen Besitzer wie das Sequenzobjekt hat, sind beim Aufrufen der Standardeinschränkung keine Berechtigungen für das Sequenzobjekt erforderlich.If the default constraint has the same owner as the sequence object, no permissions are required on the sequence object when the default constraint is called.

  • Wenn die Standardeinschränkung und das Sequenzobjekt nicht dem gleichen Benutzer gehören, sind Berechtigungen für das Sequenzobjekt auch beim Aufrufen der Standardeinschränkung erforderlich.If the default constraint and the sequence object are not owned by the same user, permissions are required on the sequence object even if it is called through the default constraint.

AuditAudit

Sie können die NEXT VALUE FOR-Funktion überwachen, indem Sie die SCHEMA_OBJECT_ACCESS_GROUP überwachen.To audit the NEXT VALUE FOR function, monitor the SCHEMA_OBJECT_ACCESS_GROUP.

BeispieleExamples

Beispiele zum Erstellen von Sequenzen und Verwenden der NEXT VALUE FOR-Funktion für das Generieren von Sequenznummern finden Sie unter Sequenznummern.For examples of both creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

In den folgenden Beispielen wird die Sequenz CountBy1 im Schema Test verwendet.The following examples use a sequence named CountBy1 in a schema named Test. Führen Sie die folgende Anweisung aus, um die Test.CountBy1-Sequenz zu erstellen.Execute the following statement to create the Test.CountBy1 sequence. In den Beispielen C und E wird die Datenbank AdventureWorks2012AdventureWorks2012 verwendet; die CountBy1-Sequenz wird daher in dieser Datenbank erstellt.Examples C and E use the AdventureWorks2012AdventureWorks2012 database, so the CountBy1 sequence is created in that database.

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

A.A. Verwenden einer Sequenz in einer SELECT-AnweisungUsing a sequence in a select statement

Im folgenden Beispiel wird die Sequenz CountBy1 erstellt, die bei jeder Verwendung um den Wert eins vergrößert wird.The following example creates a sequence named CountBy1 that increases by one every time that it is used.

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

Hier ist das Resultset.Here is the result set.

FirstUse  
1  
 
SecondUse  
2

B.B. Festlegen einer Variable auf den nächsten SequenzwertSetting a variable to the next sequence value

Im folgenden Beispiel werden drei Möglichkeiten veranschaulicht, eine Variable auf den nächsten Wert einer Sequenznummer festzulegen.The following example demonstrates three ways to set a variable to the next value of a sequence number.

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.C. Verwenden einer Sequenz mit einer FensterrangfunktionUsing a sequence with a ranking window function

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

D:D. Verwenden der NEXT VALUE FOR-Funktion in der Definition einer StandardeinschränkungUsing the NEXT VALUE FOR function in the definition of a default constraint

Die Verwendung der NEXT VALUE FOR-Funktion in der Definition einer Standardeinschränkung wird unterstützt.Using the NEXT VALUE FOR function in the definition of a default constraint is supported. Ein Beispiel für die Verwendung der NEXT VALUE FOR-Funktion in einer CREATE TABLE-Anweisung finden Sie unter Beispiel C Sequenznummern.For an example of using NEXT VALUE FOR in a CREATE TABLE statement, see Example CSequence Numbers. Im folgenden Beispiel wird ALTER TABLE verwendet, um eine Sequenz als Standard einer aktuellen Tabelle hinzuzufügen.The following example uses ALTER TABLE to add a sequence as a default to a current table.

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.E. Verwenden der NEXT VALUE FOR-Funktion in einer INSERT-AnweisungUsing the NEXT VALUE FOR function in an INSERT statement

Im folgenden Beispiel wird die Tabelle TestTable erstellt, und mit der NEXT VALUE FOR-Funktion wird eine Zeile eingefügt.The following example creates a table named TestTable and then uses the NEXT VALUE FOR function to insert a row.

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.E. Verwenden der NEXT VALUE FOR-Funktion mit SELECT ... INTOUsing the NEXT VALUE FOR function with SELECT ... INTO

Im folgenden Beispiel wird mit der SELECT ... INTO-Anweisung eine Tabelle namens Production.NewLocation erstellt und mit der NEXT VALUE FOR-Funktion jede Zeile nummeriert.The following example uses the SELECT ... INTO statement to create a table named Production.NewLocation and uses the NEXT VALUE FOR function to number each row.

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

F.F. Erteilen der Berechtigung zum Ausführen von NEXT VALUE FORGranting permission to execute NEXT VALUE FOR

Im folgenden Beispiel wird dem Benutzer AdventureWorks\Larry die UPDATE-Berechtigung zum Ausführen von NEXT VALUE FOR mit der Test.CounterSeq-Sequenz gewährt.The following example grants UPDATE permission to a user named AdventureWorks\Larry permission to execute NEXT VALUE FOR using the Test.CounterSeq sequence.

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

Weitere InformationenSee Also

CREATE SEQUENCE (Transact-SQL) CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL) ALTER SEQUENCE (Transact-SQL)
SequenznummernSequence Numbers