Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
Generiert eine Sequenznummer aus dem angegebenen Sequenzobjekt.
Eine umfassende Erläuterung der Erstellung und Verwendung von Sequenzen finden Sie unter Sequenznummern. Mit sp_sequence_get_range können Sie einen Bereich von Sequenznummern reservieren.
Transact-SQL-Syntaxkonventionen
Syntax
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]
Argumente
database_name
Der Name der Datenbank mit dem Sequenzobjekt.
schema_name
Der Name des Schemas mit dem Sequenzobjekt.
sequence_name
Der Name des Sequenzobjekts, von dem die Nummer generiert wird.
over_order_by_clause
Bestimmt die Reihenfolge, in der der Sequenzwert den Zeilen in einer Partition zugewiesen wird. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).
Rückgabetypen
Gibt mit dem Typ der Sequenz eine Nummer zurück.
Bemerkungen
Die NEXT VALUE FOR-Funktion kann in gespeicherten Prozeduren und Triggern verwendet werden.
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.
Die NEXT VALUE FOR-Funktion ist nicht deterministisch und nur in Kontexten zulässig, in denen die Anzahl der generierten Sequenzwerte exakt definiert ist. Nachfolgend finden Sie eine Definition der Anzahl der Werte, die für das jeweilige Sequenzobjekt, auf das verwiesen wird, in einer Anweisung verwendet werden:
SELECT: Für jedes Sequenzobjekt, auf das verwiesen wird, wird im Ergebnis der Anweisung einmal pro Zeile ein neuer Wert generiert.
INSERT ... VALUES – Für jedes referenzierte Sequenzobjekt wird für jede eingefügte Zeile in der Anweisung einmal ein neuer Wert generiert.
UPDATE - Für jedes referenzierte Sequenzobjekt wird für jede von der Anweisung aktualisierte Zeile ein neuer Wert generiert.
Prozedurale Anweisungen (wie DECLARE,SET , , usw.) – Für jedes referenzierte Sequenzobjekt wird für jede Anweisung ein neuer Wert generiert.
Einschränkungen
Die NEXT VALUE FOR-Funktion kann in den folgenden Situationen nicht verwendet werden:
Bei Datenbanken im schreibgeschützten Modus
Bei Argumenten für eine Tabellenwertfunktion
Bei Argumenten für eine Aggregatfunktion
Bei Unterabfragen einschließlich allgemeiner Tabellenausdrücke und abgeleiteter Tabellen
Bei Sichten, in benutzerdefinierten Funktionen oder in berechneten Spalten
Bei Anweisungen, die den Operator DISTINCT, UNION, UNION ALL, EXCEPT oder INTERSECT verwenden.
Bei Anweisungen, die die ORDER BY-Klausel verwenden, es sei denn, NEXT VALUE FOR ... OVER (ORDER BY …) wird verwendet.
Bei den folgenden Klauseln: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY oder FOR XML.
Bei bedingten Ausdrücken mit CASE, CHOOSE, COALESCE, IIF, ISNULL oder NULLIF.
In einer VALUES-Klausel ist das nicht Teil einer INSERT Aussage.
Bei der Definition einer CHECK-Einschränkung
Bei der Definition einer Regel oder eines Standardobjekts. (Die Verwendung in einer Standardeinschränkung ist möglich.)
Als Standard in einem benutzerdefinierten Tabellentyp.
In einer Anweisung mit TOP,OFFSET oder wenn die ROWCOUNT Option gesetzt ist.
In der WHERE-Klausel einer Anweisung.
In einer Aussage MERGE . (Außer wenn die Funktion NEXT VALUE FOR in einer Standard-Constraint in der Zieltabelle verwendet wird und Standard in der CREATE-Anweisung der MERGE Anweisung verwendet wird.)
Verwenden eines Sequenzobjekts in einer Standardeinschränkung
Wenn Sie die NEXT VALUE FOR-Funktion in einer Standardeinschränkung verwenden, gelten die folgenden Regeln:
Standardeinschränkungen in mehreren Tabellen können auf ein einzelnes Sequenzobjekt verweisen.
Die Tabelle und das Sequenzobjekt müssen sich in der gleichen Datenbank befinden.
Der Benutzer, der die Standardeinschränkung hinzufügt, muss über die REFERENCES-Berechtigung für das Sequenzobjekt verfügen.
Ein Sequenzobjekt, auf das von einer Standardeinschränkung verwiesen wird, kann nicht gelöscht werden, bevor nicht die Standardeinschränkung gelöscht wurde.
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.
Verweise auf die NEXT VALUE FOR-Funktion in einer Standardeinschränkung können keine OVER-Klausel angeben.
Ein Sequenzobjekt, auf das in einer Standardeinschränkung verwiesen wird, kann geändert werden.
Bei einer
INSERT ... SELECT- oderINSERT ... 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.
Verwenden eines Sequenzobjekts mit einer OVER ORDER BY-Klausel
Die NEXT VALUE FOR-Funktion unterstützt das Generieren von sortierten Sequenzwerten durch Verwenden der OVER-Klausel für den NEXT VALUE FOR-Aufruf. 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. Die Verwendung der NEXT VALUE FOR-Funktion mit der OVER-Klausel unterliegt folgenden zusätzlichen Regeln:
Mehrere Aufrufe der NEXT VALUE FOR-Funktion für den gleichen Sequenzgenerator in einer einzelnen Anweisung müssen jeweils die gleiche OVER-Klauseldefinition verwenden.
Mehrere Aufrufe der NEXT VALUE FOR-Funktion, die auf unterschiedliche Sequenzgeneratoren in einer einzelnen Anweisung verweisen, können verschiedene OVER-Klauseldefinitionen aufweisen.
Eine OVER-Klausel, die auf die NEXT VALUE FOR-Funktion angewendet wird, unterstützt keine PARTITION BY-Unterklausel.
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.
Die OVER-Klausel kann mit der NEXT VALUE FOR-Funktion in einer SELECT-Anweisung oder in einer
INSERT ... SELECT ...-Anweisung verwendet werden. Die Verwendung der OVER-Klausel mit der Funktion NEXT VALUE FOR ist in UPDATE oder MERGE Anweisungen nicht erlaubt.Wenn ein anderer Prozess zur gleichen Zeit auf das Sequenzobjekt zugreift, weisen die zurückgegebenen Zahlen möglicherweise Lücken auf.
Metadaten
Fragen Sie die sys.sequences-Katalogsicht ab, um Informationen zu Sequenzen zu erhalten.
Sicherheit
Berechtigungen
Erfordert UPDATE Berechtigungen für das Sequenzobjekt oder das Schema der Sequenz. Ein Beispiel für das Gewähren der Berechtigung finden Sie weiter unten in diesem Thema in Beispiel F.
Besitzverkettung
Sequenzobjekte unterstützen die Besitzverkettung. 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. 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.
Wenn die Funktion NEXT VALUE FOR als Standardwert in einer Tabelle verwendet wird, benötigen Benutzer sowohl INSERT Berechtigungen für die Tabelle als auch UPDATE für das Sequenzobjekt, um Daten mit dem Standard einzufügen.
Wenn die Standardeinschränkung den gleichen Besitzer wie das Sequenzobjekt hat, sind beim Aufrufen der Standardeinschränkung keine Berechtigungen für das Sequenzobjekt erforderlich.
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.
Audit
Sie können die NEXT VALUE FOR-Funktion überwachen, indem Sie die SCHEMA_OBJECT_ACCESS_GROUP überwachen.
Beispiele
Beispiele zum Erstellen von Sequenzen und Verwenden der NEXT VALUE FOR-Funktion für das Generieren von Sequenznummern finden Sie unter Sequenznummern.
In den folgenden Beispielen wird die Sequenz CountBy1 im Schema Test verwendet. Führen Sie die folgende Anweisung aus, um die Test.CountBy1-Sequenz zu erstellen. In den Beispielen C und E wird die Datenbank AdventureWorks2025 verwendet; die CountBy1-Sequenz wird daher in dieser Datenbank erstellt.
USE AdventureWorks2022;
GO
CREATE SCHEMA Test;
GO
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
A. Verwenden einer Sequenz in einer SELECT-Anweisung
Im folgenden Beispiel wird die Sequenz CountBy1 erstellt, die bei jeder Verwendung um den Wert eins vergrößert wird.
SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;
Hier sehen Sie das Ergebnis.
FirstUse
1
SecondUse
2
B. Festlegen einer Variable auf den nächsten Sequenzwert
Im folgenden Beispiel werden drei Möglichkeiten veranschaulicht, eine Variable auf den nächsten Wert einer Sequenznummer festzulegen.
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. Verwenden einer Sequenz mit einer Fensterrangfunktion
USE AdventureWorks2022;
GO
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,
FirstName, LastName
FROM Person.Contact ;
GO
D: Verwenden der NEXT VALUE FOR-Funktion in der Definition einer Standardeinschränkung
Die Verwendung der NEXT VALUE FOR-Funktion in der Definition einer Standardeinschränkung wird unterstützt. Ein Beispiel für die Verwendung von NEXT VALUE FOR in einer CREATE TABLE Anweisung siehe BeispielC-Sequenznummern. Im folgenden Beispiel wird ALTER TABLE verwendet, um eine Sequenz als Standard einer aktuellen Tabelle hinzuzufügen.
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. Verwendung der Funktion NEXT VALUE FOR in einer INSERT Anweisung
Im folgenden Beispiel wird die Tabelle TestTable erstellt, und mit der NEXT VALUE FOR-Funktion wird eine Zeile eingefügt.
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. Verwenden der NEXT VALUE FOR-Funktion mit 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.
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. Erteilen der Berechtigung zum Ausführen von NEXT VALUE FOR
Das folgende Beispiel gewährt UPDATE einer benutzerbenannten AdventureWorks\Larry Berechtigung zur Ausführung NEXT VALUE FOR mit der Sequenz Test.CounterSeq .
GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;
Weitere Informationen
CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL)
Sequenznummern