Partilhar via


PRÓXIMO VALOR PARA (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Gera um número de sequência a partir do objeto de sequência especificado.

Para uma discussão completa sobre a criação e utilização de sequências, veja Números de Sequência. Use sp_sequence_get_range para gerar um intervalo de números de sequência.

Transact-SQL convenções de sintaxe

Sintaxe

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

Arguments

database_name
O nome da base de dados que contém o objeto de sequência.

schema_name
O nome do esquema que contém o objeto de sequência.

sequence_name
O nome do objeto de sequência que gera o número.

over_order_by_clause
Determina a ordem em que o valor da sequência é atribuído às linhas de uma partição. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).

Tipos de devolução

Devolve um número usando o tipo da sequência.

Observações

O PRÓXIMO VALOR PARA pode ser usado em procedimentos armazenados e triggers.

Quando o PRÓXIMO VALOR PARA a função for usado numa consulta ou restrição por defeito, se o mesmo objeto de sequência for usado mais do que uma vez, ou se o mesmo objeto de sequência for usado tanto na instrução que fornece os valores, como numa restrição padrão a ser executada, o mesmo valor será devolvido para todas as colunas que referenciam a mesma sequência dentro de uma linha do conjunto de resultados.

O PRÓXIMO VALOR PARA a função é não determinístico e só é permitido em contextos onde o número de valores de sequência gerados está bem definido. Abaixo está a definição de quantos valores serão usados para cada objeto de sequência referenciado numa dada afirmação:

  • SELECT - Para cada objeto de sequência referenciado, um novo valor é gerado uma vez por linha no resultado da instrução.

  • INSERIR ... VALORES - Para cada objeto de sequência referenciado, um novo valor é gerado uma vez para cada linha inserida na instrução.

  • ATUALIZAÇÃO - Para cada objeto de sequência referenciado, é gerado um novo valor para cada linha atualizada pela instrução.

  • Instruções procedurais (como DECLARE, SET, etc.) - Para cada objeto de sequência referenciado, é gerado um novo valor para cada instrução.

Limitações e Restrições

O PRÓXIMO VALOR PARA a função não pode ser usado nas seguintes situações:

  • Quando uma base de dados está em modo apenas de leitura.

  • Como argumento para uma função com valores em tabela.

  • Como argumento para uma função agregada.

  • Em subconsultas, incluindo expressões de tabelas comuns e tabelas derivadas.

  • Em vistas, em funções definidas pelo utilizador ou em colunas computadas.

  • Numa instrução usando os operadores DISTINCT,UNION,UNION ALL, EXCEPT ou INTERSECT .

  • Numa afirmação usando a cláusula ORDER BY , a menos que PRÓXIMO VALOR PARA ... OVER (ORDER BY ...) é utilizado.

  • Nas seguintes cláusulas: FETCH, OVER, OUTPUT,ON, PIVOT,UNPIVOT,GROUP BY, HAVING, COMPUTE, COMPUTE BY, ou FOR XML.

  • Em expressões condicionais usando CASE, CHOOSE, COALESCE,IIF, ISNULL ou NULLIF.

  • Numa cláusula VALUES que não faz parte de uma instrução INSERT .

  • Na definição de uma restrição de verificação.

  • Na definição de regra ou objeto padrão. (Pode ser usado numa restrição padrão.)

  • Como padrão num tipo de tabela definido pelo utilizador.

  • Numa instrução usando TOP,OFFSET ou quando a opção ROWCOUNT está definida.

  • Na cláusula WHERE de uma afirmação.

  • Numa declaração MERGE . (Exceto quando a função NEXT VALUE FOR é usada numa restrição por defeito na tabela de destino e o defeito é usado na instrução CREATE da instrução MERGE .)

Utilização de um objeto de sequência numa restrição padrão

Ao usar a função NEXT VALUE FOR numa restrição padrão, aplicam-se as seguintes regras:

  • Um único objeto de sequência pode ser referenciado a partir de restrições padrão em múltiplas tabelas.

  • A tabela e o objeto de sequência devem residir na mesma base de dados.

  • O utilizador que adiciona a restrição por defeito deve ter permissão REFERENCES no objeto de sequência.

  • Um objeto de sequência referenciado a partir de uma restrição padrão não pode ser eliminado antes de a restrição padrão ser eliminada.

  • O mesmo número de sequência é devolvido para todas as colunas de uma linha se múltiplas restrições por defeito usarem o mesmo objeto de sequência, ou se o mesmo objeto de sequência for usado tanto na instrução que fornece os valores como numa restrição por defeito a ser executada.

  • Referências à função NEXT VALUE FOR numa restrição padrão não podem especificar a cláusula OVER .

  • Um objeto de sequência referenciado numa restrição padrão pode ser alterado.

  • No caso de uma INSERT ... SELECT instrução ou INSERT ... EXEC em que os dados inseridos provêm de uma consulta usando uma cláusula ORDER BY , os valores devolvidos pela função NEXT VALUE FOR serão gerados na ordem especificada pela cláusula ORDER BY .

Usar um objeto de sequência com uma cláusula OVER ORDER BY

A função NEXT VALUE FOR suporta gerar valores de sequência ordenados aplicando a cláusula OVER ao NEXT VALUE FOR chamada. Ao usar a cláusula OVER, o utilizador tem a garantia de que os valores devolvidos são gerados na ordem da subcláusula ORDER BY da cláusula OVER. As seguintes regras adicionais aplicam-se ao usar a função NEXT VALUE FOR com a cláusula OVER :

  • Múltiplas chamadas para a função NEXT VALUE FOR para o mesmo gerador de sequência numa única instrução devem todas usar a mesma definição da cláusula OVER .

  • Múltiplas chamadas ao PRÓXIMO VALOR PARA a função que referenciam diferentes geradores de sequência numa única instrução podem ter definições diferentes da cláusula OVER .

  • Uma cláusula OVER aplicada ao PRÓXIMO VALOR PARA a função não suporta a subcláusula PARTITION BY .

  • Se todas as chamadas à função NEXT VALUE FOR numa instrução SELECT especificarem a cláusula OVER , pode ser usada uma cláusula ORDER BY na instrução SELECT .

  • A cláusula OVER é permitida com a função NEXT VALUE FOR quando usada numa instrução ouINSERT ... SELECT ... instrução SELECT. A utilização da cláusula OVER com a função NEXT VALUE FOR não é permitida nas instruções UPDATE ou MERGE .

  • Se outro processo estiver a aceder ao objeto de sequência ao mesmo tempo, os números devolvidos podem ter lacunas.

Metadados

Para informações sobre sequências, consulte a vista de catálogo sys.sequences .

Segurança

Permissions

Requer permissão UPDATE no objeto de sequência ou no esquema da sequência. Para um exemplo de concessão de permissão, veja o exemplo F mais adiante neste tópico.

Encadeamento de Propriedade

Os objetos de sequência suportam encadeamento de propriedade. Se o objeto de sequência tiver o mesmo proprietário que o procedimento armazenado que chama, trigger ou tabela (tendo um objeto de sequência como restrição por defeito), não é necessária verificação de permissão no objeto de sequência. Se o objeto de sequência não pertencer ao mesmo utilizador do procedimento armazenado, trigger ou tabela que chama, é necessária uma verificação de permissão no objeto de sequência.

Quando a função NEXT VALUE FOR é usada como valor padrão numa tabela, os utilizadores necessitam tanto da permissão INSERT na tabela como da permissão UPDATE no objeto de sequência, para inserir dados usando o padrão.

  • Se a restrição por defeito tiver o mesmo proprietário que o objeto de sequência, não são necessárias permissões sobre o objeto de sequência quando a restrição por defeito é chamada.

  • Se a restrição por defeito e o objeto de sequência não pertencerem ao mesmo utilizador, são necessárias permissões sobre o objeto de sequência mesmo que este seja chamado através da restrição padrão.

Audit

Para auditar o PRÓXIMO VALOR PARA função, monitorize o SCHEMA_OBJECT_ACCESS_GROUP.

Examples

Para exemplos tanto de criação de sequências como de utilização da função NEXT VALUE FOR para gerar números de sequência, veja Números de Sequência.

Os exemplos seguintes usam uma sequência nomeada CountBy1 num esquema chamado Test. Execute a seguinte instrução para criar a Test.CountBy1 sequência. Os exemplos C e E usam a AdventureWorks2025 base de dados, por isso a CountBy1 sequência é criada nessa base de dados.

USE AdventureWorks2022;  
GO  
  
CREATE SCHEMA Test;  
GO  
  
CREATE SEQUENCE Test.CountBy1  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

A. Utilização de uma sequência numa instrução select

O exemplo seguinte cria uma sequência chamada CountBy1 que aumenta em um sempre que é utilizada.

SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;  
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;  

Aqui está o conjunto de resultados.

FirstUse  
1  
 
SecondUse  
2

B. Definir uma variável para o valor da sequência seguinte

O exemplo seguinte demonstra três formas de definir uma variável para o valor seguinte de um número de sequência.

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. Usar uma sequência com uma função janela de classificação

USE AdventureWorks2022;  
GO  
  
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,  
    FirstName, LastName  
FROM Person.Contact ;  
GO  

D. Usar a função NEXT VALUE FOR na definição de uma restrição por defeito

É suportado o uso da função NEXT VALUE FOR na definição de uma restrição padrão. Para um exemplo de utilização do PRÓXIMO VALOR PARA numa instrução CREATE TABLE , vejaExemplo de Números de Sequência C. O exemplo seguinte serve ALTER TABLE para adicionar uma sequência como padrão a uma tabela atual.

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. Usar a função NEXT VALUE FOR numa instrução INSERT

O exemplo seguinte cria uma tabela nomeada TestTable e depois usa a NEXT VALUE FOR função para inserir uma linha.

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. Usando a função NEXT VALUE FOR com SELECT ... PARA

O exemplo seguinte usa a SELECT ... INTO instrução para criar uma tabela nomeada Production.NewLocation e usa a NEXT VALUE FOR função para numerar cada linha.

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. Concedendo permissão para executar O PRÓXIMO VALOR PARA

O exemplo seguinte concede permissão UPDATE a um utilizador nomeado AdventureWorks\Larry permissão para executar NEXT VALUE FOR usando a Test.CounterSeq sequência.

GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;  

Ver também

CRIAR SEQUÊNCIA (Transact-SQL)
SEQUÊNCIA ALTER (Transact-SQL)
Números de sequência