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

APLICA-SE A: simSQL Server (a partir do 2012) simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2012) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Gera um número de sequência do objeto de sequência especificado.Generates a sequence number from the specified sequence object.

Para obter uma discussão completa sobre a criação e o uso de sequências, consulte Números de sequência.For a complete discussion of both creating and using sequences, see Sequence Numbers. Use sp_sequence_get_range para gerar e reservar um intervalo de números de sequência.Use sp_sequence_get_range to generate reserve a range of sequence numbers.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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

ArgumentosArguments

database_namedatabase_name
O nome do banco de dados que contém o objeto de sequência.The name of the database that contains the sequence object.

schema_nameschema_name
O nome do esquema que contém o objeto de sequência.The name of the schema that contains the sequence object.

sequence_namesequence_name
O nome do objeto de sequência que gera o número.The name of the sequence object that generates the number.

over_order_by_clauseover_order_by_clause
Determina a ordem na qual o valor da sequência é atribuído às linhas de uma partição.Determines the order in which the sequence value is assigned to the rows in a partition. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Tipos de retornoReturn Types

Retorna um número usando o tipo da sequência.Returns a number using the type of the sequence.

RemarksRemarks

A função NEXT VALUE FOR pode ser usada em procedimentos armazenados e gatilhos.The NEXT VALUE FOR function can be used in stored procedures and triggers.

Quando a função NEXT VALUE FOR for usada em uma consulta ou restrição padrão, se o mesmo objeto de sequência for usado mais de uma vez ou se o mesmo objeto de sequência for usado na instrução que fornece os valores e em uma restrição padrão em execução, o mesmo valor será retornado para todas as colunas que referenciam a mesma sequência em uma linha no 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.

A função NEXT VALUE FOR é não determinística e apenas é permitida em contextos em que o número de valores de sequência gerados é bem definido.The NEXT VALUE FOR function is nondeterministic, and is only allowed in contexts where the number of generated sequence values is well defined. Abaixo está a definição de quantos valores serão usados para cada objeto de sequência referenciado em uma determinada instrução:Below is the definition of how many values will be used for each referenced sequence object in a given statement:

  • SELECT – Para cada objeto de sequência referenciado, um novo valor é gerado uma vez por linha no resultado da instrução.SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERT ... VALUES – Para cada objeto de sequência referenciado, um novo valor é gerado uma vez para cada linha inserida na instrução.INSERT ... VALUES - For each referenced sequence object, a new value is generated once for each inserted row in the statement.

  • UPDATE – Para cada objeto de sequência referenciado, um novo valor é gerado para cada linha atualizada pela instrução.UPDATE - For each referenced sequence object, a new value is generated for each row being updated by the statement.

  • Instruções procedurais (como DECLARE, SET, etc.) – Para cada objeto de sequência referenciado, um novo valor é gerado para cada instrução.Procedural statements (such as DECLARE, SET, etc.) - For each referenced sequence object, a new value is generated for each statement.

Limitações e restriçõesLimitations and Restrictions

A função NEXT VALUE FOR não pode ser usada nas seguintes situações:The NEXT VALUE FOR function cannot be used in the following situations:

  • Quando um banco de dados está em modo somente leitura.When a database is in read-only mode.

  • Como um argumento para uma função com valor de tabela.As an argument to a table-valued function.

  • Como um argumento para uma função de agregação.As an argument to an aggregate function.

  • Em subconsultas inclusive expressões de tabela comuns e tabelas derivadas.In subqueries including common table expressions and derived tables.

  • Em exibições, em funções definidas pelo usuário, ou em colunas computadas.In views, in user-defined functions, or in computed columns.

  • Em uma instrução que usa o operador DISTINCT, UNION, UNION ALL, EXCEPT ou INTERSECT.In a statement using the DISTINCT, UNION, UNION ALL, EXCEPT or INTERSECT operator.

  • Em uma instrução que usa a cláusula ORDER BY, a menos que NEXT VALUE FOR ... OVER (ORDER BY ...) seja usado.In a statement using the ORDER BY clause unless NEXT VALUE FOR ... OVER (ORDER BY ...) is used.

  • Nas seguintes cláusulas: 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.

  • Em expressões condicionais que usam CASE, CHOOSE, COALESCE, IIF, ISNULL ou NULLIF.In conditional expressions using CASE, CHOOSE, COALESCE, IIF, ISNULL, or NULLIF.

  • Em uma cláusula VALUES que não faz parte de uma instrução INSERT.In a VALUES clause that is not part of an INSERT statement.

  • Na definição de uma restrição de verificação.In the definition of a check constraint.

  • Na definição de uma regra ou objeto padrão.In the definition of a rule or default object. (Pode ser usado em uma restrição padrão.)(It can be used in a default constraint.)

  • Como padrão em um tipo de tabela definido pelo usuário.As a default in a user-defined table type.

  • Em uma instrução que usa TOP, OFFSET ou quando a opção ROWCOUNT é definida.In a statement using TOP, OFFSET, or when the ROWCOUNT option is set.

  • Na cláusula WHERE de uma instrução.In the WHERE clause of a statement.

  • Em uma instrução MERGE.In a MERGE statement. (Exceto quando a função NEXT VALUE FOR é usada em uma restrição padrão na tabela de destino e o padrão é usado na instrução CREATE da instrução 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.)

Usando um objeto de sequência em uma restrição padrãoUsing a Sequence Object in a Default Constraint

Ao usar a função NEXT VALUE FOR em uma restrição padrão, as seguintes regras se aplicam:When using the NEXT VALUE FOR function in a default constraint, the following rules apply:

  • Um único objeto de sequência pode ser referenciado de restrições padrão em várias tabelas.A single sequence object may be referenced from default constraints in multiple tables.

  • A tabela e o objeto de sequência devem residir no mesmo banco de dados.The table and the sequence object must reside in the same database.

  • O usuário que adiciona a restrição padrão deve ter permissão de REFERENCES no objeto de sequência.The user adding the default constraint must have REFERENCES permission on the sequence object.

  • Um objeto de sequência que é referenciado de uma restrição padrão não pode ser removido antes da restrição padrão ser removida.A sequence object that is referenced from a default constraint cannot be dropped before the default constraint is dropped.

  • A mesma sequência de número é retornada para todas as colunas em uma linha se diversas restrições padrão usam o mesmo objeto de sequência, ou se o mesmo objeto de sequência for usado na instrução que fornece os valores, e em uma restrição padrão que é executada.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.

  • As referências à função NEXT VALUE FOR em uma restrição padrão não podem especificar a cláusula OVER.References to the NEXT VALUE FOR function in a default constraint cannot specify the OVER clause.

  • Um objeto de sequência referenciado em uma restrição padrão pode ser alterado.A sequence object that is referenced in a default constraint can be altered.

  • No caso de uma instrução INSERT ... SELECT ou INSERT ... EXEC em que os dados inseridos são obtidos de uma consulta que usa uma cláusula ORDER BY, os valores retornados pela função NEXT VALUE FOR serão gerados na ordem especificada pela 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.

Usando um objeto de sequência com uma cláusula OVER ORDER BYUsing a Sequence Object with an OVER ORDER BY Clause

A função NEXT VALUE FOR é compatível com a geração de valores de sequência classificados com a aplicação da cláusula OVER à chamada NEXT VALUE FOR.The NEXT VALUE FOR function supports generating sorted sequence values by applying the OVER clause to the NEXT VALUE FOR call. Usando a cláusula OVER, um usuário tem a garantia de que os valores retornados são gerados na ordem da subcláusula ORDER BY da 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. As seguintes regras adicionais aplicam-se ao usar a função NEXT VALUE FOR com a cláusula OVER:The following additional rules apply when using the NEXT VALUE FOR function with the OVER clause:

  • Diversas chamadas à função NEXT VALUE FOR para o mesmo gerador de sequência em uma única instrução devem todas usar a mesma definição de 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.

  • Diversas chamadas à função NEXT VALUE FOR que referenciam diferentes geradores de sequência em uma única instrução podem ter diferentes definições de 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.

  • Uma cláusula OVER aplicada à função NEXT VALUE FOR não dá suporte à subcláusula PARTITION BY.An OVER clause applied to the NEXT VALUE FOR function does not support the PARTITION BY sub clause.

  • Se todas as chamadas à função NEXT VALUE FOR em uma instrução SELECT especificarem a cláusula OVER, uma cláusula ORDER BY poderá ser usada na instrução 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.

  • A cláusula OVER é permitida com a função NEXT VALUE FOR quando usada em uma instrução SELECT ou INSERT ... SELECT ....The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT ... SELECT ... statement. O uso da cláusula OVER com a função NEXT VALUE FOR não é permitido em instruções UPDATE ou MERGE.Use of the OVER clause with the NEXT VALUE FOR function is not allowed in UPDATE or MERGE statements.

  • Se outro processo estiver acessando o objeto de sequência ao mesmo tempo, os números retornados poderão ter intervalos.If another process is accessing the sequence object at the same time, the numbers returned could have gaps.

MetadadosMetadata

Para obter informações sobre sequências, consulte a exibição do catálogo sys.sequences.For information about sequences, query the sys.sequences catalog view.

SegurançaSecurity

PermissõesPermissions

Exige a permissão UPDATE no objeto de sequência ou o esquema da sequência.Requires UPDATE permission on the sequence object or the schema of the sequence. Para obter um exemplo de concessão de permissão, consulte o exemplo F posteriormente neste tópico.For an example of granting permission, see example F later in this topic.

Encadeamento de propriedadeOwnership Chaining

Objetos de sequência oferecem suporte a encadeamento de propriedade.Sequence objects support ownership chaining. Se o objeto de sequência tiver o mesmo proprietário que o procedimento armazenado de chamada, gatilho ou tabela (tendo um objeto de sequência como uma restrição padrão), nenhuma verificação de permissão será exigida no objeto de sequência.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. Se o objeto de sequência não tiver o mesmo proprietário que o procedimento armazenado de chamada, gatilho ou tabela, uma verificação de permissão será exigida no objeto de sequência.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.

Quando a função NEXT VALUE FOR é usada como um valor padrão em uma tabela, os usuários precisam das permissões INSERT na tabela e UPDATE no objeto de sequência para inserir dados usando o padrão.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.

  • Se a restrição padrão tiver o mesmo proprietário que o objeto de sequência, nenhuma permissão será exigida no objeto de sequência quando a restrição padrão for chamada.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.

  • Se a restrição padrão e o objeto de sequência não tiverem o mesmo proprietário, as permissões serão exigidas no objeto de sequência mesmo que seja chamada através de uma restrição padrão.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.

Auditar oAudit

Para auditar a função NEXT VALUE FOR, monitore o SCHEMA_OBJECT_ACCESS_GROUP.To audit the NEXT VALUE FOR function, monitor the SCHEMA_OBJECT_ACCESS_GROUP.

ExemplosExamples

Para obter exemplos de como criar sequências e usar a função NEXT VALUE FOR para gerar números de sequência, consulte Números de sequência.For examples of both creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

Os exemplos a seguir usam uma sequência chamada CountBy1 em um esquema chamado Test.The following examples use a sequence named CountBy1 in a schema named Test. Execute a seguinte instrução para criar a sequência Test.CountBy1.Execute the following statement to create the Test.CountBy1 sequence. Os exemplos C e E usam o banco de dados AdventureWorks2012AdventureWorks2012, portanto, a sequência CountBy1 é criada naquele banco de dados.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. Usando uma sequência em uma instrução selectUsing a sequence in a select statement

O exemplo a seguir cria uma sequência chamada CountBy1, que aumenta em incrementos de um cada vez que é utilizada.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;  

Aqui está o conjunto de resultados.Here is the result set.

FirstUse  
1  
 
SecondUse  
2

B.B. Definindo uma variável como o próximo valor de sequênciaSetting a variable to the next sequence value

O exemplo a seguir demonstra três modos de definir uma variável como o próximo valor de um número de sequência.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. Usando uma sequência com uma função de janela de classificaçãoUsing 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. Usando a função NEXT VALUE FOR na definição de uma restrição padrãoUsing the NEXT VALUE FOR function in the definition of a default constraint

Há compatibilidade com o uso da função NEXT VALUE FOR na definição de uma restrição padrão.Using the NEXT VALUE FOR function in the definition of a default constraint is supported. Para obter um exemplo de como usar NEXT VALUE FOR em uma instrução CREATE TABLE, veja o exemplo C em Números de sequência.For an example of using NEXT VALUE FOR in a CREATE TABLE statement, see Example CSequence Numbers. O exemplo a seguir usa ALTER TABLE para adicionar uma sequência como um padrão em uma tabela atual.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. Usando uma função NEXT VALUE FOR em uma instrução INSERTUsing the NEXT VALUE FOR function in an INSERT statement

O exemplo a seguir cria uma tabela chamada TestTable e usa a função NEXT VALUE FOR para inserir uma linha.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. Usando a função NEXT VALUE FOR com SELECT ... INTOUsing the NEXT VALUE FOR function with SELECT ... INTO

O exemplo a seguir usa a instrução SELECT ... INTO para criar uma tabela chamada Production.NewLocation e usa a função NEXT VALUE FOR para numerar cada linha.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. Concedendo permissão para executar NEXT VALUE FORGranting permission to execute NEXT VALUE FOR

O exemplo a seguir concede a permissão UPDATE a uma permissão AdventureWorks\Larry nomeada pelo usuário para executar NEXT VALUE FOR usando a sequência 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 TambémSee Also

CREATE SEQUENCE (Transact-SQL) CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL) ALTER SEQUENCE (Transact-SQL)
Números de sequênciaSequence Numbers