NEXT VALUE FOR (Transact-SQL)
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.
Hinweise
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 generierter 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 Sequenzobjekt, auf das verwiesen wird, wird in der Anweisung einmal pro eingefügter Zeile ein neuer Wert generiert.
UPDATE– Für jedes Sequenzobjekt, auf das verwiesen wird, wird ein neuer Wert für jede Zeile generiert, die von der Anweisung aktualisiert wird.
Verfahrensanweisungen (z. B. DECLARE und SET) – Für jedes Sequenzobjekt, auf das verwiesen wird, wird ein neuer Wert für jede Anweisung 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
In einer Anweisung mit dem Operator DISTINCT, UNION, UNION ALL, EXCEPT oder INTERSECT
In einer Anweisung mit der ORDER BY-Klausel, sofern nicht NEXT VALUE FOR … OVER (ORDER BY-…) verwendet wird
In den folgenden Klauseln: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY oder FOR XML
In bedingten Ausdrücken mit CASE, CHOOSE, COALESCE, IIF, ISNULL oder NULLIF
In einer VALUES-Klausel, die nicht Teil einer INSERT-Anweisung ist
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 bei Angabe der ROWCOUNT-Option
In der WHERE-Klausel einer Anweisung
In einer MERGE-Anweisung (Ausnahme: Wenn die NEXT VALUE FOR-Funktion in einer Standardeinschränkung in der Zieltabelle verwendet wird und in der CREATE-Anweisung der MERGE-Anweisung der Standardwert 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 enthalten.
Ein Sequenzobjekt, auf das in einer Standardeinschränkung verwiesen wird, kann geändert werden.
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.
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. Bei Verwendung der NEXT VALUE FOR-Funktion mit der OVER-Klausel gelten die folgenden zusätzlichen Regeln:
Mehrere Aufrufe der NEXT VALUE FOR-Funktion für den gleichen Sequenz-Generator in einer einzelnen Anweisung müssen die gleiche OVER-Klauseldefinition aufweisen.
Mehrere Aufrufe der NEXT VALUE FOR-Funktion, die auf unterschiedliche Sequenz-Generatoren in einer einzelnen Anweisung verweisen, können unterschiedliche 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 enthalten, 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 NEXT VALUE FOR-Funktion ist in UPDATE- oder MERGE-Anweisungen nicht zulässig.
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 die UPDATE-Berechtigung 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 NEXT VALUE FOR-Funktion als Standardwert in einer Tabelle verwendet wird, benötigen Benutzer sowohl die INSERT-Berechtigung für die Tabelle als auch die UPDATE-Berechtigung für das Sequenzobjekt, um Daten mithilfe der Standardeinstellung hinzuzufü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.
Überwachung
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 Test im Schema CountBy1 verwendet. Führen Sie die folgende Anweisung aus, um die Test.CountBy1-Sequenz zu erstellen. In den Beispielen C und E wird die Datenbank AdventureWorks2012 verwendet; die CountBy1-Sequenz wird daher in dieser Datenbank erstellt.
USE AdventureWorks2012 ;
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;
Dies ist das Resultset.
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 AdventureWorks2012 ;
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 zur Verwendung von NEXT VALUE FOR in einer CREATE TABLE-Anweisung finden Sie in Beispiel CSequenznummern. 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.Verwenden der NEXT VALUE FOR-Funktion 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 die Tabelle Production.NewLocation mit der SELECT … INTO-Anweisung erstellt, und die einzelnen Zeilen werden mit der NEXT VALUE FOR-Funktion nummeriert.
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.Erteilen der Berechtigung zum Ausführen von 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 erteilt.
GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;
Siehe auch
Verweis
CREATE SEQUENCE (Transact-SQL)