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

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2012)ouiAzure SQL DatabasenonAzure SQL Data Warehouse nonParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Génère un numéro séquentiel de l'objet séquence spécifié.Generates a sequence number from the specified sequence object.

Pour une description complète de la création et de l’utilisation de séquences, consultez Numéros séquentiels.For a complete discussion of both creating and using sequences, see Sequence Numbers. Utilisez sp_sequence_get_range pour réserver une plage de numéros séquentiels.Use sp_sequence_get_range to generate reserve a range of sequence numbers.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax


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

ArgumentsArguments

database_namedatabase_name
Nom de la base de données qui contient l'objet séquence.The name of the database that contains the sequence object.

schema_nameschema_name
Nom du schéma qui contient l'objet séquence.The name of the schema that contains the sequence object.

sequence_namesequence_name
Nom de l'objet séquence qui génère le nombre.The name of the sequence object that generates the number.

over_order_by_clauseover_order_by_clause
Détermine l'ordre dans lequel la valeur de séquence est affectée aux lignes d'une partition.Determines the order in which the sequence value is assigned to the rows in a partition. Pour plus d’informations, consultez Clause OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Types de retourReturn Types

Retourne un nombre à l'aide du type de la séquence.Returns a number using the type of the sequence.

Notes Remarks

La fonction NEXT VALUE FOR peut être utilisée dans les procédures stockées et les déclencheurs.The NEXT VALUE FOR function can be used in stored procedures and triggers.

Lorsque la fonction NEXT VALUE FOR est utilisée dans une requête ou une contrainte par défaut, si le même objet séquence est utilisé plusieurs fois, ou si le même objet séquence est utilisé à la fois dans l’instruction qui fournit les valeurs et dans une contrainte par défaut en cours d’exécution, la même valeur est retournée pour toutes les colonnes qui référencent la même séquence dans une ligne dans le jeu de résultats.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.

La fonction NEXT VALUE FOR est non déterministe et n’est autorisée que dans les contextes où le nombre de valeurs de séquence générées est bien défini.The NEXT VALUE FOR function is nondeterministic, and is only allowed in contexts where the number of generated sequence values is well defined. Vous trouverez ci-dessous la définition du nombre de valeurs qui sera utilisé pour chaque objet séquence référencé dans une instruction donnée :Below is the definition of how many values will be used for each referenced sequence object in a given statement:

  • SELECT - Pour chaque objet séquence référencé, une nouvelle valeur est générée une fois par ligne dans le résultat de l’instruction.SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERTINSERT VALUES - Pour chaque objet séquence référencé, une nouvelle valeur est générée une fois par ligne insérée dans l’instruction.VALUES - For each referenced sequence object, a new value is generated once for each inserted row in the statement.

  • UPDATE - Pour chaque objet séquence référencé, une nouvelle valeur est générée pour chaque ligne mise à jour par l’instruction.UPDATE - For each referenced sequence object, a new value is generated for each row being updated by the statement.

  • Instructions de procédure (telles que DECLARE, SET, etc.) - Pour chaque objet séquence référencé, une nouvelle valeur est générée pour chaque instruction.Procedural statements (such as DECLARE, SET, etc.) - For each referenced sequence object, a new value is generated for each statement.

Limitations et restrictionsLimitations and Restrictions

La fonction NEXT VALUE FOR ne peut pas être utilisée dans les situations suivantes :The NEXT VALUE FOR function cannot be used in the following situations:

  • Lorsqu'une base de données est en mode en lecture seule.When a database is in read-only mode.

  • Comme argument à une fonction table.As an argument to a table-valued function.

  • Comme argument à une fonction d'agrégation.As an argument to an aggregate function.

  • Dans les sous-requêtes, notamment les expressions de table communes et les tables dérivées.In subqueries including common table expressions and derived tables.

  • Dans les vues, dans les fonctions définies par l'utilisateur ou dans les colonnes calculées.In views, in user-defined functions, or in computed columns.

  • Dans une instruction qui utilise l’opérateur DISTINCT, UNION, UNION ALL, EXCEPT ou INTERSECT.In a statement using the DISTINCT, UNION, UNION ALL, EXCEPT or INTERSECT operator.

  • Dans une instruction qui utilise la clause ORDER BY, sauf si NEXT VALUE FORIn a statement using the ORDER BY clause unless NEXT VALUE FOR OVER (ORDER BY …) est utilisé.OVER (ORDER BY …) is used.

  • Dans les clauses suivantes : FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY ou FOR XML.In the following clauses: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY, or FOR XML.

  • Dans les expressions conditionnelles qui utilisent CASE, CHOOSE, COALESCE, IIF, ISNULL ou NULLIF.In conditional expressions using CASE, CHOOSE, COALESCE, IIF, ISNULL, or NULLIF.

  • Dans une clause VALUES qui ne fait pas partie d’une instruction INSERT.In a VALUES clause that is not part of an INSERT statement.

  • Dans la définition d'une contrainte de validation.In the definition of a check constraint.

  • Dans la définition d'une règle ou d'un objet par défaut.In the definition of a rule or default object. (Il peut être utilisé dans une contrainte par défaut.)(It can be used in a default constraint.)

  • Comme valeur par défaut dans un type de table défini par l'utilisateur.As a default in a user-defined table type.

  • Dans une instruction qui utilise TOP, OFFSET, ou lorsque l’option ROWCOUNT est définie.In a statement using TOP, OFFSET, or when the ROWCOUNT option is set.

  • Dans la clause WHERE d’une instruction.In the WHERE clause of a statement.

  • Dans une instruction MERGE.In a MERGE statement. (Sauf lorsque la fonction NEXT VALUE FOR est utilisée dans une contrainte par défaut dans la table cible et que la valeur par défaut est utilisée dans l’instruction CREATE de l’instruction MERGE.)(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.)

Utilisation d'un objet séquence dans une contrainte par défautUsing a Sequence Object in a Default Constraint

Quand vous utilisez la fonction NEXT VALUE FOR dans une contrainte par défaut, les règles suivantes s’appliquent :When using the NEXT VALUE FOR function in a default constraint, the following rules apply:

  • Un objet séquence unique peut être référencé à partir de contraintes par défaut dans plusieurs tables.A single sequence object may be referenced from default constraints in multiple tables.

  • La table et l'objet séquence doivent résider dans la même base de données.The table and the sequence object must reside in the same database.

  • L'utilisateur qui ajoute la contrainte par défaut doit avoir l'autorisation REFERENCES sur l'objet séquence.The user adding the default constraint must have REFERENCES permission on the sequence object.

  • Un objet séquence référencé à partir d'une contrainte par défaut ne peut pas être supprimé avant la suppression de la contrainte par défaut.A sequence object that is referenced from a default constraint cannot be dropped before the default constraint is dropped.

  • Le même numéro séquentiel est retourné pour toutes les colonnes dans une ligne si plusieurs contraintes par défaut utilisent le même objet séquence, ou si le même objet séquence est utilisé à la fois dans l'instruction qui fournit les valeurs et dans une contrainte par défaut en cours d'exécution.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.

  • Les références à la fonction NEXT VALUE FOR dans une contrainte par défaut ne peuvent pas spécifier la clause OVER.References to the NEXT VALUE FOR function in a default constraint cannot specify the OVER clause.

  • Un objet séquence référencé dans une contrainte par défaut peut être modifié.A sequence object that is referenced in a default constraint can be altered.

  • Dans le cas d’une instruction INSERT … SELECT ou INSERT … EXEC où les données insérées proviennent d’une requête qui utilise une clause ORDER BY, les valeurs retournées par la fonction NEXT VALUE FOR sont générées dans l’ordre spécifié par la clause ORDER BY.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.

Utilisation d'un objet séquence avec une clause OVER ORDER BYUsing a Sequence Object with an OVER ORDER BY Clause

La fonction NEXT VALUE FOR prend en charge la génération de valeurs de séquence triées en appliquant la clause OVER à l’appel NEXT VALUE FOR.The NEXT VALUE FOR function supports generating sorted sequence values by applying the OVER clause to the NEXT VALUE FOR call. En utilisant la clause OVER, un utilisateur a la certitude que les valeurs retournées sont générées dans l’ordre de la sous-clause ORDER BY de la clause OVER.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. Les règles supplémentaires suivantes s’appliquent lors de l’utilisation de la fonction NEXT VALUE FOR avec la clause OVER :The following additional rules apply when using the NEXT VALUE FOR function with the OVER clause:

  • Les appels multiples à la fonction NEXT VALUE FOR pour le même générateur de séquence dans une instruction unique doivent tous utiliser la même définition de clause OVER.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.

  • Les appels multiples à la fonction NEXT VALUE FOR qui référence différents générateurs de séquence dans une instruction unique peuvent avoir des définitions de clause OVER différentes.Multiple calls to the NEXT VALUE FOR function that reference different sequence generators in a single statement can have different OVER clause definitions.

  • Une clause OVER appliquée à la fonction NEXT VALUE FOR ne prend pas en charge la sous-clause PARTITION BY.An OVER clause applied to the NEXT VALUE FOR function does not support the PARTITION BY sub clause.

  • Si tous les appels à la fonction NEXT VALUE FOR dans une instruction SELECT spécifient la clause OVER, une clause ORDER BY peut être utilisée dans l’instruction SELECT.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.

  • La clause OVER est autorisée avec la fonction NEXT VALUE FOR en cas d’utilisation dans une instruction SELECT ou une instruction INSERT … SELECT ….The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT … SELECT … statement. L’utilisation de la clause OVER avec la fonction NEXT VALUE FOR n’est pas autorisée dans des instructions UPDATE ou MERGE.Use of the OVER clause with the NEXT VALUE FOR function is not allowed in UPDATE or MERGE statements.

  • Si un autre processus accède simultanément à l'objet séquence, les nombres retournés peuvent comporter des espaces vides.If another process is accessing the sequence object at the same time, the numbers returned could have gaps.

MétadonnéesMetadata

Pour plus d’informations sur les séquences, interrogez la vue de catalogue sys.sequences.For information about sequences, query the sys.sequences catalog view.

SécuritéSecurity

AutorisationsPermissions

Nécessite l’autorisation UPDATE sur l’objet séquence ou le schéma de la séquence.Requires UPDATE permission on the sequence object or the schema of the sequence. Pour obtenir un exemple d'octroi d'une autorisation, consultez l'exemple F dans la suite de cette rubrique.For an example of granting permission, see example F later in this topic.

Chaînage des propriétésOwnership Chaining

Les objets séquences prennent en charge le chaînage des propriétés.Sequence objects support ownership chaining. Si l'objet séquence a le même propriétaire que la procédure stockée appelante, le déclencheur ou la table (ayant un objet séquence comme contrainte par défaut), aucun contrôle d'autorisation n'est obligatoire sur l'objet séquence.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. Si l'objet séquence n'est pas détenu par le même utilisateur que la procédure stockée appelante, le déclencheur ou la table, un contrôle d'autorisation est obligatoire sur l'objet séquence.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.

Lorsque la fonction NEXT VALUE FOR est utilisée comme valeur par défaut dans une table, les utilisateurs ont à la fois besoin de l’autorisation INSERT sur la table et de l’autorisation UPDATE sur l’objet séquence, pour insérer des données à l’aide de la valeur par défaut.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.

  • Si la contrainte par défaut a le même propriétaire que l'objet séquence, aucune autorisation n'est obligatoire sur l'objet séquence lorsque la contrainte par défaut est appelée.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.

  • Si la contrainte par défaut et l'objet séquence ne sont pas détenus par le même utilisateur, des autorisations sont requises sur l'objet séquence même s'il est appelé via la contrainte par défaut.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

Pour auditer la fonction NEXT VALUE FOR, surveillez SCHEMA_OBJECT_ACCESS_GROUP.To audit the NEXT VALUE FOR function, monitor the SCHEMA_OBJECT_ACCESS_GROUP.

ExemplesExamples

Pour obtenir des exemples de création de séquences et d’utilisation de la fonction NEXT VALUE FOR pour générer des numéros séquentiels, consultez Numéros séquentiels.For examples of both creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

Les exemples suivants utilisent une séquence nommée CountBy1 dans un schéma nommé Test.The following examples use a sequence named CountBy1 in a schema named Test. Exécutez l'instruction suivante pour créer la séquence Test.CountBy1.Execute the following statement to create the Test.CountBy1 sequence. Les exemples C et E utilisent la base de données AdventureWorks2012AdventureWorks2012 ; par conséquent, la séquence CountBy1 est créée dans cette base de données.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. Utilisation d'une séquence dans une instruction SELECTUsing a sequence in a select statement

L'exemple suivant crée une séquence nommée CountBy1 qui augmente de 1 chaque fois qu'elle est utilisée.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;  

Voici le jeu des résultats.Here is the result set.

FirstUse  
1  

SecondUse  
2

B.B. Définition d'une variable sur la valeur de séquence suivanteSetting a variable to the next sequence value

L'exemple suivant illustre trois façons d'affecter à une variable la valeur suivante d'un numéro séquentiel.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. Utilisation d'une séquence avec une fonction de fenêtre de classementUsing 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. Utilisation de la fonction NEXT VALUE FOR dans la définition d'une contrainte par défautUsing the NEXT VALUE FOR function in the definition of a default constraint

L’utilisation de la fonction NEXT VALUE FOR dans la définition d’une contrainte par défaut est prise en charge.Using the NEXT VALUE FOR function in the definition of a default constraint is supported. Pour obtenir un exemple d’utilisation de NEXT VALUE FOR dans une instruction CREATE TABLE, consultez l’exemple C de Numéros séquentiels.For an example of using NEXT VALUE FOR in a CREATE TABLE statement, see Example CSequence Numbers. L'exemple suivant utilise ALTER TABLE pour ajouter une séquence comme valeur par défaut à une table actuelle.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. Utilisation de la fonction NEXT VALUE FOR dans une instruction INSERTUsing the NEXT VALUE FOR function in an INSERT statement

L'exemple suivant crée une table nommée TestTable, puis utilise la fonction NEXT VALUE FOR pour insérer une ligne.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. Utilisation de la fonction NEXT VALUE FOR avec SELECT…Using the NEXT VALUE FOR function with SELECT … INTOINTO

L’exemple suivant utilise l’instruction SELECT … INTO pour créer une table nommée Production.NewLocation et utilise la fonction NEXT VALUE FOR pour numéroter chaque ligne.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. Octroi d'une autorisation pour exécuter NEXT VALUE FORGranting permission to execute NEXT VALUE FOR

L’exemple suivant accorde l’autorisation UPDATE à un utilisateur nommé AdventureWorks\Larry afin de l’autoriser à exécuter NEXT VALUE FOR à l’aide de la séquence Test.CounterSeq.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] ;  

Voir aussiSee Also

CREATE SEQUENCE (Transact-SQL) CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL) ALTER SEQUENCE (Transact-SQL)
Numéros de séquenceSequence Numbers