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

SE APLICA A: síSQL Server (a partir de 2012) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2012) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Genera un número de secuencia a partir del objeto de secuencia especificado.Generates a sequence number from the specified sequence object.

Para más información sobre cómo crear y usar secuencias, vea Números de secuencia.For a complete discussion of both creating and using sequences, see Sequence Numbers. Use sp_sequence_get_range para generar una reserva de un intervalo de números de secuencia.Use sp_sequence_get_range to generate reserve a range of sequence numbers.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

database_namedatabase_name
Nombre de la base de datos que contiene el objeto de secuencia.The name of the database that contains the sequence object.

schema_nameschema_name
Nombre del esquema que contiene el objeto de secuencia.The name of the schema that contains the sequence object.

sequence_namesequence_name
Nombre del objeto de secuencia que genera el número.The name of the sequence object that generates the number.

over_order_by_clauseover_order_by_clause
Determina el orden en el que se asigna el valor de secuencia a las filas de una partición.Determines the order in which the sequence value is assigned to the rows in a partition. Para más información, vea Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Tipos devueltosReturn Types

Devuelve un número utilizando el tipo de la secuencia.Returns a number using the type of the sequence.

NotasRemarks

La función NEXT VALUE FOR se puede usar en procedimientos almacenados y en desencadenadores.The NEXT VALUE FOR function can be used in stored procedures and triggers.

Cuando la función NEXT VALUE FOR se usa en una consulta o restricción predeterminada, si se usa más de una vez el mismo objeto de secuencia, o si se usa el mismo objeto de secuencia en la instrucción que proporciona los valores y en una restricción predeterminada que se está ejecutando, se devolverá el mismo valor para todas las columnas que hagan referencia a la misma secuencia dentro de una fila del conjunto de resultados.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 función NEXT VALUE FOR es no determinista y solo se permite en contextos donde se define bien el número de valores de secuencia generados.The NEXT VALUE FOR function is nondeterministic, and is only allowed in contexts where the number of generated sequence values is well defined. A continuación se encuentra la definición de cuántos valores se utilizarán para cada objeto de secuencia al que se hace referencia en una instrucción determinada:Below is the definition of how many values will be used for each referenced sequence object in a given statement:

  • SELECT: por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo una vez por fila en el resultado de la instrucción.SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERT ... VALUES: por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo una vez por cada fila insertada en la instrucción.INSERT ... VALUES - For each referenced sequence object, a new value is generated once for each inserted row in the statement.

  • UPDATE: por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo para cada fila que actualiza la instrucción.UPDATE - For each referenced sequence object, a new value is generated for each row being updated by the statement.

  • Instrucciones de procedimiento (como DECLARE, SET, etc.): por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo para cada instrucción.Procedural statements (such as DECLARE, SET, etc.) - For each referenced sequence object, a new value is generated for each statement.

Limitaciones y restriccionesLimitations and Restrictions

La función NEXT VALUE FOR no se puede usar en las siguientes situaciones:The NEXT VALUE FOR function cannot be used in the following situations:

  • Cuando una base de datos está en modo de solo lectura.When a database is in read-only mode.

  • Como argumento a una función con valores de tabla.As an argument to a table-valued function.

  • Como argumento a una función de agregado.As an argument to an aggregate function.

  • En subconsultas que contienen expresiones de tabla comunes y tablas derivadas.In subqueries including common table expressions and derived tables.

  • En vistas, en funciones definidas por el usuario o en columnas calculadas.In views, in user-defined functions, or in computed columns.

  • En una instrucción que use los operadores DISTINCT, UNION, UNION ALL, EXCEPT o INTERSECT.In a statement using the DISTINCT, UNION, UNION ALL, EXCEPT or INTERSECT operator.

  • En una instrucción que use la cláusula ORDER BY, a menos que se use NEXT VALUE FOR ... OVER (ORDER BY ...).In a statement using the ORDER BY clause unless NEXT VALUE FOR ... OVER (ORDER BY ...) is used.

  • En las cláusulas siguientes: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY o FOR XML.In the following clauses: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY, or FOR XML.

  • En expresiones condicionales que usan CASE, CHOOSE, COALESCE, IIF, ISNULL o NULLIF.In conditional expressions using CASE, CHOOSE, COALESCE, IIF, ISNULL, or NULLIF.

  • En una cláusula VALUES que no forme parte de una instrucción INSERT.In a VALUES clause that is not part of an INSERT statement.

  • En la definición de una restricción CHECK.In the definition of a check constraint.

  • En la definición de una regla u objeto predeterminado.In the definition of a rule or default object. (Se puede utilizar en una restricción predeterminada).(It can be used in a default constraint.)

  • Como valor predeterminado de un tipo de tabla definido por el usuario.As a default in a user-defined table type.

  • En una instrucción que use TOP, OFFSET o cuando se establece la opción ROWCOUNT.In a statement using TOP, OFFSET, or when the ROWCOUNT option is set.

  • En la cláusula WHERE de una instrucción.In the WHERE clause of a statement.

  • En una instrucción MERGEIn a MERGE statement. (salvo cuando la función NEXT VALUE FOR se use en una restricción predeterminada en la tabla de destino y el valor predeterminado se use en la instrucción CREATE de la instrucción 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.)

Utilizar un objeto de secuencia en una restricción predeterminadaUsing a Sequence Object in a Default Constraint

Al usar la función NEXT VALUE FOR en una restricción predeterminada, se aplican las siguientes reglas:When using the NEXT VALUE FOR function in a default constraint, the following rules apply:

  • Se puede hacer referencia a un objeto de secuencia único desde restricciones Default en varias tablas.A single sequence object may be referenced from default constraints in multiple tables.

  • La tabla y el objeto de secuencia deben residir en la misma base de datos.The table and the sequence object must reside in the same database.

  • El usuario que agrega la restricción predeterminada debe tener el permiso REFERENCES en el objeto de secuencia.The user adding the default constraint must have REFERENCES permission on the sequence object.

  • No se puede quitar un objeto de secuencia al que se haga referencia desde una restricción predeterminada antes de quitar la restricción predeterminada.A sequence object that is referenced from a default constraint cannot be dropped before the default constraint is dropped.

  • Se devuelve el mismo número de secuencia para todas las columnas de una fila si varias restricciones Default utilizan el mismo objeto de secuencia, o si el mismo objeto de secuencia se utiliza en la instrucción que proporciona los valores y en una restricción Default que se esté ejecutando.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.

  • Las referencias a la función NEXT VALUE FOR de una restricción predeterminada no pueden especificar la cláusula OVER.References to the NEXT VALUE FOR function in a default constraint cannot specify the OVER clause.

  • Se puede modificar un objeto de secuencia al que se haga referencia en una restricción predeterminada.A sequence object that is referenced in a default constraint can be altered.

  • En el caso de las instrucciones INSERT ... SELECT o INSERT ... EXEC en las que los datos que se van a insertar procedan de una consulta con una cláusula ORDER BY, los valores que devuelva la función NEXT VALUE FOR se generarán en el orden especificado por la cláusula 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.

Utilizar un objeto de secuencia con una cláusula OVER ORDER BYUsing a Sequence Object with an OVER ORDER BY Clause

La función NEXT VALUE FOR permite generar valores de secuencia ordenados aplicando la cláusula OVER a la llamada a NEXT VALUE FOR.The NEXT VALUE FOR function supports generating sorted sequence values by applying the OVER clause to the NEXT VALUE FOR call. Si usa la cláusula OVER, el usuario tiene la garantía de que los valores que se devuelven se generan en el orden de la subcláusula ORDER BY de la cláusula 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. Al usar la función NEXT VALUE FOR con la cláusula OVER, se aplican las siguientes reglas adicionales:The following additional rules apply when using the NEXT VALUE FOR function with the OVER clause:

  • Si hay varias llamadas a la función NEXT VALUE FOR para el mismo generador de secuencias en una única instrucción, todas deben usar la misma definición de la cláusula 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.

  • Si hay varias llamadas a la función NEXT VALUE FOR que hacen referencia a distintos generadores de secuencias en una única instrucción, pueden tener distintas definiciones de la cláusula OVER.Multiple calls to the NEXT VALUE FOR function that reference different sequence generators in a single statement can have different OVER clause definitions.

  • Una cláusula OVER aplicada a la función NEXT VALUE FOR no admite la subcláusula PARTITION BY.An OVER clause applied to the NEXT VALUE FOR function does not support the PARTITION BY sub clause.

  • Si todas las llamadas a la función NEXT VALUE FOR de una instrucción SELECT especifican la cláusula OVER, se puede usar una cláusula ORDER BY en la instrucción 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 cláusula OVER se admite con la función NEXT VALUE FOR si se usa en una instrucción SELECT o una instrucción INSERT ... SELECT ....The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT ... SELECT ... statement. No se puede usar la cláusula OVER con la función NEXT VALUE FOR en las instrucciones UPDATE ni MERGE.Use of the OVER clause with the NEXT VALUE FOR function is not allowed in UPDATE or MERGE statements.

  • Si otro proceso está teniendo acceso al objeto de secuencia a la vez, los números devueltos podrían tener lagunas.If another process is accessing the sequence object at the same time, the numbers returned could have gaps.

MetadatosMetadata

Para más información sobre las secuencias, consulte la vista de catálogo sys.sequences.For information about sequences, query the sys.sequences catalog view.

SeguridadSecurity

PermisosPermissions

Requiere el permiso UPDATE en el objeto de secuencia o el esquema de la secuencia.Requires UPDATE permission on the sequence object or the schema of the sequence. Para obtener un ejemplo de concesión de permisos, vea el ejemplo F más adelante en este tema.For an example of granting permission, see example F later in this topic.

Encadenamiento de propiedadOwnership Chaining

Los objetos de secuencia son compatibles con el encadenamiento de propiedad.Sequence objects support ownership chaining. Si el objeto de secuencia tiene el mismo propietario que el procedimiento almacenado, desencadenador o tabla que hace la llamada (y un objeto de secuencia como restricción predeterminada), no se necesita ninguna comprobación de permiso en el objeto de secuencia.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 el objeto de secuencia no pertenece al mismo propietario que el procedimiento almacenado, desencadenador o tabla que hace la llamada, se requiere una comprobación de permiso en el objeto de secuencia.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.

Cuando la función NEXT VALUE FOR se usa como valor predeterminado en una tabla, los usuarios deben tener el permiso INSERT en la tabla y el permiso UPDATE en el objeto de secuencia para insertar datos por medio del valor predeterminado.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 restricción predeterminada tiene el mismo propietario que el objeto de secuencia, no es necesario ningún permiso en el objeto de secuencia cuando se llama a la restricción predeterminada.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 restricción predeterminada y el objeto de secuencia no son propiedad del mismo usuario, se necesitan permisos en el objeto de secuencia aunque la llamada se haga mediante la restricción predeterminada.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.

AuditarAudit

Para auditar la función NEXT VALUE FOR supervise SCHEMA_OBJECT_ACCESS_GROUP.To audit the NEXT VALUE FOR function, monitor the SCHEMA_OBJECT_ACCESS_GROUP.

EjemplosExamples

Para ver ejemplos de cómo crear secuencias y cómo usar la función NEXT VALUE FOR para generar números de secuencia, vea Números de secuencia.For examples of both creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

En los siguientes ejemplos se utiliza una secuencia denominada CountBy1 en un esquema denominado Test.The following examples use a sequence named CountBy1 in a schema named Test. Ejecute la siguiente instrucción para crear la secuencia Test.CountBy1.Execute the following statement to create the Test.CountBy1 sequence. En los ejemplos C y E se utiliza la base de datos AdventureWorks2012AdventureWorks2012, de modo que la secuencia CountBy1 se cree en esa base de datos.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. Usar una secuencia en una instrucción SELECTUsing a sequence in a select statement

En el siguiente ejemplo se crea una secuencia denominada CountBy1 que aumenta en uno cada vez que se utiliza.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;  

El conjunto de resultados es el siguiente.Here is the result set.

FirstUse  
1  
 
SecondUse  
2

B.B. Establecer una variable en el siguiente valor de la secuenciaSetting a variable to the next sequence value

En el ejemplo siguiente se muestran tres maneras de establecer una variable en el siguiente valor de un número de secuencia.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. Usar una secuencia con una función de ventana de categoríaUsing 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. Usar la función NEXT VALUE FOR en la definición de una restricción predeterminadaUsing the NEXT VALUE FOR function in the definition of a default constraint

La función NEXT VALUE FOR se puede usar en la definición de una restricción predeterminada.Using the NEXT VALUE FOR function in the definition of a default constraint is supported. Para ver un ejemplo de uso de NEXT VALUE FOR en una instrucción CREATE TABLE, vea el ejemplo C de Números de secuencia.For an example of using NEXT VALUE FOR in a CREATE TABLE statement, see Example CSequence Numbers. En el siguiente ejemplo se utiliza ALTER TABLE para agregar una secuencia como valor predeterminado a una tabla actual.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. Usar la función NEXT VALUE FOR en una instrucción INSERTUsing the NEXT VALUE FOR function in an INSERT statement

En el siguiente ejemplo se crea una tabla denominada TestTable y, a continuación, se utiliza la función NEXT VALUE FOR para insertar una fila.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. Usar la función NEXT VALUE FOR con SELECT ... INTOUsing the NEXT VALUE FOR function with SELECT ... INTO

En el siguiente ejemplo se usa la instrucción SELECT ... INTO para crear una tabla denominada Production.NewLocation y se usa la funciónNEXT VALUE FOR para numerar cada fila.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. Conceder permiso para ejecutar NEXT VALUE FORGranting permission to execute NEXT VALUE FOR

En el siguiente ejemplo se concede el permiso UPDATE a un usuario denominado AdventureWorks\Larry para ejecutar NEXT VALUE FOR con 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] ;  

Consulte tambiénSee Also

CREATE SEQUENCE (Transact-SQL) CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL) ALTER SEQUENCE (Transact-SQL)
Números de secuenciaSequence Numbers