CREATE SEQUENCE (Transact-SQL)CREATE SEQUENCE (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Cria um objeto de sequência e especifica suas propriedades.Creates a sequence object and specifies its properties. Uma sequência é um objeto associado a um esquema definido pelo usuário que gera uma sequência de valores numéricos de acordo com a especificação com a qual a sequência foi criada.A sequence is a user-defined schema bound object that generates a sequence of numeric values according to the specification with which the sequence was created. A sequência de valores numéricos é gerada em ordem crescente ou decrescente em um intervalo definido e pode ser configurada para reiniciar (em um ciclo) quando se esgotar.The sequence of numeric values is generated in an ascending or descending order at a defined interval and can be configured to restart (cycle) when exhausted. As sequências, ao contrário de colunas de identidade, não são associadas a tabelas específicas.Sequences, unlike identity columns, are not associated with specific tables. Os aplicativos fazem referência a um objeto de sequência para recuperar seu próximo valor.Applications refer to a sequence object to retrieve its next value. A relação entre sequências e tabelas é controlada pelo aplicativo.The relationship between sequences and tables is controlled by the application. Os aplicativos de usuário podem referenciar um objeto de sequência e coordenar os valores nas várias linhas e tabelas.User applications can reference a sequence object and coordinate the values across multiple rows and tables.

Ao contrário de valores de colunas de identidade que são gerados quando as linhas são inseridas, um aplicativo pode obter o próximo número de sequência sem inserir a linha por meio da chamada da função NEXT VALUE FOR.Unlike identity columns values that are generated when rows are inserted, an application can obtain the next sequence number without inserting the row by calling the NEXT VALUE FOR function. Use sp_sequence_get_range para obter vários números de sequência de uma vez.Use sp_sequence_get_range to get multiple sequence numbers at once.

Para obter informações e cenários que usam CREATE SEQUENCE e a função NEXT VALUE FOR , consulte Números de sequência.For information and scenarios that use both CREATE SEQUENCE and the NEXT VALUE FOR function, see Sequence Numbers.

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

SintaxeSyntax

CREATE SEQUENCE [schema_name . ] sequence_name  
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]  
    [ START WITH <constant> ]  
    [ INCREMENT BY <constant> ]  
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]  
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]  
    [ CYCLE | { NO CYCLE } ]  
    [ { CACHE [ <constant> ] } | { NO CACHE } ]  
    [ ; ]  

ArgumentosArguments

sequence_namesequence_name
Especifica o nome exclusivo pelo qual a sequência é conhecida no banco de dados.Specifies the unique name by which the sequence is known in the database. O tipo é sysname.Type is sysname.

[ built_in_integer_type | user-defined_integer_type[ built_in_integer_type | user-defined_integer_type
Uma sequência pode ser definida como qualquer tipo de inteiro.A sequence can be defined as any integer type. Os seguintes tipos são permitidos:The following types are allowed.

  • tinyint – intervalo de 0 a 255tinyint - Range 0 to 255
  • smallint – intervalo de -32.768 a 32.767smallint - Range -32,768 to 32,767
  • int – intervalo de -2.147.483.648 a 2.147.483.647int - Range -2,147,483,648 to 2,147,483,647
  • bigint – intervalo 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807bigint - Range -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • decimal e numeric com uma escala de 0.decimal and numeric with a scale of 0.
  • Qualquer tipo de dados definido pelo usuário (tipo de alias) que seja baseado em um dos tipos permitidos.Any user-defined data type (alias type) that is based on one of the allowed types.

Se nenhum tipo de dados for fornecido, o tipo de dados bigint será usado como o padrão.If no data type is provided, the bigint data type is used as the default.

START WITH <constant>START WITH <constant>
O primeiro valor retornado pelo objeto de sequência.The first value returned by the sequence object. O valor START deve ser menor ou igual ao valor máximo e maior ou igual ao valor mínimo do objeto de sequência.The START value must be a value less than or equal to the maximum and greater than or equal to the minimum value of the sequence object. O valor de início padrão para um novo objeto de sequência é o valor mínimo para um objeto de sequência e o valor máximo de um objeto de sequência decrescente.The default start value for a new sequence object is the minimum value for an ascending sequence object and the maximum value for a descending sequence object.

INCREMENT BY <constant>INCREMENT BY <constant>
O valor usado para incrementar (ou decrementar, se negativo) o valor do objeto de sequência para cada chamada da função NEXT VALUE FOR.Value used to increment (or decrement if negative) the value of the sequence object for each call to the NEXT VALUE FOR function. Se o incremento for um valor negativo, o objeto de sequência será decrescente, caso contrário, será crescente.If the increment is a negative value, the sequence object is descending; otherwise, it is ascending. O incremento não pode ser 0.The increment cannot be 0. O incremento padrão para um novo objeto de sequência é 1.The default increment for a new sequence object is 1.

[ MINVALUE <constant> | NO MINVALUE ][ MINVALUE <constant> | NO MINVALUE ]
Especifica os limites do objeto de sequência.Specifies the bounds for the sequence object. O valor mínimo padrão de um novo objeto de sequência é o valor mínimo do tipo de dados do objeto de sequência.The default minimum value for a new sequence object is the minimum value of the data type of the sequence object. É zero para o tipo de dados tinyint e um número negativo para todos os outros tipos de dados.This is zero for the tinyint data type and a negative number for all other data types.

[ MAXVALUE <constant> | NO MAXVALUE[ MAXVALUE <constant> | NO MAXVALUE
Especifica os limites do objeto de sequência.Specifies the bounds for the sequence object. O valor máximo padrão para um novo objeto de sequência é o valor máximo do tipo de dados do objeto de sequência.The default maximum value for a new sequence object is the maximum value of the data type of the sequence object.

[ CYCLE | NO CYCLE ][ CYCLE | NO CYCLE ]
Propriedade que especifica se o objeto de sequência deve reiniciar do valor mínimo (ou máximo para objetos de sequência decrescente) ou deve lançar uma exceção quando seu valor mínimo ou máximo é excedido.Property that specifies whether the sequence object should restart from the minimum value (or maximum for descending sequence objects) or throw an exception when its minimum or maximum value is exceeded. A opção de ciclo padrão para novos objetos de sequência é NO CYCLE.The default cycle option for new sequence objects is NO CYCLE.

Observação

Clicar em SEQUENCE reinicia do valor mínimo ou máximo, não do valor inicial.Cycling a SEQUENCE restarts from the minimum or maximum value, not from the start value.

[ CACHE [<constant> ] | NO CACHE ][ CACHE [<constant> ] | NO CACHE ]
Aumenta o desempenho de aplicativos que usam objetos de sequência por meio da minimização do número de E/S de disco necessárias para gerar números de sequência.Increases performance for applications that use sequence objects by minimizing the number of disk IOs that are required to generate sequence numbers. Padrões para o CACHE.Defaults to CACHE.

Por exemplo, se um tamanho de cache de 50 for escolhido, o SQL ServerSQL Server não manterá 50 valores individuais em cache.For example, if a cache size of 50 is chosen, SQL ServerSQL Server does not keep 50 individual values cached. Somente permanecem em cache o valor atual e o número de valores restantes no cache.It only caches the current value and the number of values left in the cache. Isso significa que a quantidade de memória necessária para armazenar o cache sempre é duas instâncias do tipo de dados do objeto de sequência.This means that the amount of memory required to store the cache is always two instances of the data type of the sequence object.

Observação

Se a opção de cache for habilitada sem a especificação de um tamanho de cache, o Mecanismo de Banco de Dados selecionará um tamanho.If the cache option is enabled without specifying a cache size, the Database Engine will select a size. Porém, os usuários não devem confiar que a seleção será consistente.However, users should not rely upon the selection being consistent. MicrosoftMicrosoft pode alterar o método de cálculo do tamanho do cache sem aviso prévio.might change the method of calculating the cache size without notice.

Quando criado com a opção CACHE, um desligamento inesperado (uma falta de energia, por exemplo) pode acarretar a perda dos números de sequência restantes no cache.When created with the CACHE option, an unexpected shutdown (such as a power failure) may result in the loss of sequence numbers remaining in the cache.

Comentários geraisGeneral Remarks

Os números de sequência são gerados fora do escopo da transação atual.Sequence numbers are generated outside the scope of the current transaction. Eles serão consumidos se a transação que usa o número de sequência for confirmada ou revertida.They are consumed whether the transaction using the sequence number is committed or rolled back. A validação duplicada só ocorre quando o registro está totalmente preenchido.Duplicate validation only occurs once a record is fully populated. Isso pode resultar em alguns casos em que o mesmo número é usado para mais de um registro durante a criação, mas em seguida é identificado como uma duplicata.This can result in some cases where the same number is used for more than one record during creation, but then gets identified as a duplicate. Se isso ocorrer e outros valores de numeração automática tiverem sido aplicados a registros subsequentes, o resultado poderá ser um intervalo entre os valores de numeração automática, um comportamento esperado.If this occurs and other autonumber values have been applied to subsequent records, this can result in a gap between autonumber values and is expected behavior.

Gerenciamento de cacheCache management

Para aprimorar o desempenho, o SQL ServerSQL Server pré-aloca o número de números de sequência especificado pelo argumento CACHE.To improve performance, SQL ServerSQL Server pre-allocates the number of sequence numbers specified by the CACHE argument.

Por exemplo, uma nova sequência é criada com um valor inicial de 1 e um tamanho de cache de 15.For an example, a new sequence is created with a starting value of 1 and a cache size of 15. Quando o primeiro valor é necessário, valores de 1 a 15 são disponibilizados da memória.When the first value is needed, values 1 through 15 are made available from memory. O último valor em cache (15) é gravado nas tabelas do sistema no disco.The last cached value (15) is written to the system tables on the disk. Quando todos os 15 números são usados, a solicitação seguinte (pelo número 16) faz com que o cache seja alocado novamente.When all 15 numbers are used, the next request (for number 16) will cause the cache to be allocated again. O novo valor colocado no cache por último (30) será gravado nas tabelas do sistema.The new last cached value (30) will be written to the system tables.

Se o Mecanismo de Banco de DadosDatabase Engine for interrompido depois que você usar 22 números, o próximo número de sequência pretendido na memória (23) será gravado nas tabelas do sistema, substituindo o número armazenado antes.If the Mecanismo de Banco de DadosDatabase Engine is stopped after you use 22 numbers, the next intended sequence number in memory (23) is written to the system tables, replacing the previously stored number.

Após a reinicialização do SQL Server e quando um número de sequência for necessário, o número inicial será lido nas tabelas do sistema (23).After SQL Server restarts and a sequence number is needed, the starting number is read from the system tables (23). A quantidade de cache de 15 números (23-38) é alocada para a memória e o próximo número não de cache (39) é gravado nas tabelas do sistema.The cache amount of 15 numbers (23-38) is allocated to memory and the next non-cache number (39) is written to the system tables.

Se o Mecanismo de Banco de DadosDatabase Engine parar de modo anormal para um evento, como uma falha de energia, a sequência reiniciará com o número lido nas tabelas do sistema (39).If the Mecanismo de Banco de DadosDatabase Engine stops abnormally for an event such as a power failure, the sequence restarts with the number read from system tables (39). Todos os números de sequência alocados à memória (mas nunca solicitados por um usuário ou aplicativo) são perdidos.Any sequence numbers allocated to memory (but never requested by a user or application) are lost. Essa funcionalidade pode deixar intervalos, mas garante que o mesmo valor nunca seja emitido duas vezes para um único objeto de sequência, a menos que seja definido como CYCLE ou reiniciado manualmente.This functionality may leave gaps, but guarantees that the same value will never be issued two times for a single sequence object unless it is defined as CYCLE or is manually restarted.

O cache é mantido na memória por meio do acompanhamento do valor atual (o último valor emitido) e o número de valores restantes no cache.The cache is maintained in memory by tracking the current value (the last value issued) and the number of values left in the cache. Portanto, a quantidade de memória usada pelo cache sempre é duas instâncias do tipo de dados do objeto de sequência.Therefore, the amount of memory used by the cache is always two instances of the data type of the sequence object.

A configuração do argumento de cache como NO CACHE grava o valor de sequência atual nas tabelas do sistema sempre que uma sequência é usada.Setting the cache argument to NO CACHE writes the current sequence value to the system tables every time that a sequence is used. Isso pode prejudicar o desempenho ao aumentar o acesso ao disco, mas reduz a possibilidade de intervalos não intencionais.This might slow performance by increasing disk access, but reduces the chance of unintended gaps. Ainda poderão ocorrer intervalos se os números forem solicitados com o uso das funções NEXT VALUE FOR ou sp_sequence_get_range, mas, neste caso, os números não são usados ou são utilizados em transações não confirmadas.Gaps can still occur if numbers are requested using the NEXT VALUE FOR or sp_sequence_get_range functions, but then the numbers are either not used or are used in uncommitted transactions.

Quando um objeto de sequência usa a opção CACHE, se você reiniciar esse objeto ou alterar INCREMENT, CYCLE, MINVALUE, MAXVALUE ou as propriedades de tamanho de cache, isso fará com que o cache seja gravado nas tabelas do sistema, antes da alteração.When a sequence object uses the CACHE option, if you restart the sequence object, or alter the INCREMENT, CYCLE, MINVALUE, MAXVALUE, or the cache size properties, it will cause the cache to be written to the system tables before the change occurs. Em seguida, o cache é recarregado a partir do valor atual (ou seja, nenhum número é ignorado).Then the cache is reloaded starting with the current value (i.e. no numbers are skipped). A alteração do tamanho do cache entra em vigor imediatamente.Changing the cache size takes effect immediately.

Opção CACHE quando os valores em cache estão disponíveisCACHE option when cached values are available

O processo a seguir ocorre sempre que um objeto de sequência recebe uma solicitação para gerar o próximo valor para a opção CACHE, caso haja valores não usados disponíveis no cache na memória para o objeto de sequência.The following process occurs every time that a sequence object is requested to generate the next value for the CACHE option if there are unused values available in the in-memory cache for the sequence object.

  1. O próximo valor para o objeto de sequência é calculado.The next value for the sequence object is calculated.

  2. O novo valor atual para o objeto de sequência é atualizado na memória.The new current value for the sequence object is updated in memory.

  3. O valor calculado é retornado à instrução de chamada.The calculated value is returned to the calling statement.

Opção CACHE quando o cache está esgotadoCACHE option when the cache is exhausted

O seguinte processo ocorre sempre que um objeto de sequência recebe uma solicitação para gerar o próximo valor para a opção CACHE, quando o cache está esgotado:The following process occurs every time a sequence object is requested to generate the next value for the CACHE option if the cache has been exhausted:

  1. O próximo valor para o objeto de sequência é calculado.The next value for the sequence object is calculated.

  2. O último valor para o novo cache é calculado.The last value for the new cache is calculated.

  3. A linha da tabela do sistema para o objeto de sequência está bloqueada, e o valor calculado na etapa 2 (o último valor) é gravado na tabela do sistema.The system table row for the sequence object is locked, and the value calculated in step 2 (the last value) is written to the system table. Um xevent de cache esgotado é disparado para notificar o usuário sobre o novo valor contínuo.A cache-exhausted xevent is fired to notify the user of the new persisted value.

Opção NO CACHENO CACHE option

O processo a seguir ocorre sempre que um objeto de sequência recebe uma solicitação para gerar o próximo valor para a opção NO CACHE:The following process occurs every time that a sequence object is requested to generate the next value for the NO CACHE option:

  1. O próximo valor para o objeto de sequência é calculado.The next value for the sequence object is calculated.

  2. O novo valor atual para o objeto de sequência é gravado na tabela do sistema.The new current value for the sequence object is written to the system table.

  3. O valor calculado é retornado à instrução de chamada.The calculated value is returned to the calling statement.

MetadadosMetadata

Para obter informações sobre sequências, consulte sys.sequences.For information about sequences, query sys.sequences.

SegurançaSecurity

PermissõesPermissions

Requer a permissão CREATE SEQUENCE, ALTERou CONTROL no SCHEMA.Requires CREATE SEQUENCE, ALTER, or CONTROL permission on the SCHEMA.

  • Membros das funções de banco de dados fixas db_owner e db_ddladmin podem criar, alterar e remover objetos de sequência.Members of the db_owner and db_ddladmin fixed database roles can create, alter, and drop sequence objects.

  • Os membros das funções de banco de dados fixas db_owner e db_datawriter podem atualizar os objetos de sequência fazendo com que gerem números.Members of the db_owner and db_datawriter fixed database roles can update sequence objects by causing them to generate numbers.

O exemplo a seguir concede ao usuário permissão AdventureWorks\Larry criar sequências no esquema de teste.The following example grants the user AdventureWorks\Larry permission to create sequences in the Test schema.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO [AdventureWorks\Larry]  

A propriedade de um objeto de sequência pode ser transferida usando a instrução ALTER AUTHORIZATION.Ownership of a sequence object can be transferred by using the ALTER AUTHORIZATION statement.

Se uma sequência utilizar um tipo de dados definido pelo usuário, o autor da sequência deverá ter a permissão REFERENCES nesse tipo.If a sequence uses a user-defined data type, the creator of the sequence must have REFERENCES permission on the type.

Auditar oAudit

Para auditar CREATE SEQUENCE, monitore o SCHEMA_OBJECT_CHANGE_GROUP.To audit CREATE SEQUENCE, monitor the SCHEMA_OBJECT_CHANGE_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, veja Números de sequência.For examples of creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

A maioria dos exemplos a seguir cria objetos de sequência em um esquema denominado Teste.Most of the following examples create sequence objects in a schema named Test.

Para criar o esquema de Teste, execute a instrução a seguir.To create the Test schema, execute the following statement.

CREATE SCHEMA Test ;  
GO  

A.A. Criando uma sequência que aumenta em 1Creating a sequence that increases by 1

No exemplo a seguir, Thierry cria uma sequência chamada CountBy1, que aumenta em incrementos de um cada vez que é utilizada.In the following example, Thierry creates a sequence named CountBy1 that increases by one every time that it is used.

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

B.B. Criando uma sequência que diminui em 1Creating a sequence that decreases by 1

O exemplo a seguir inicia em 0 e conta em decrementos negativos de um cada vez que é usada.The following example starts at 0 and counts into negative numbers by one every time it is used.

CREATE SEQUENCE Test.CountByNeg1  
    START WITH 0  
    INCREMENT BY -1 ;  
GO  

C.C. Criando uma sequência que aumenta em 5Creating a sequence that increases by 5

O exemplo a seguir cria uma sequência que aumenta em incrementos de 5 cada vez que é utilizada.The following example creates a sequence that increases by 5 every time it is used.

CREATE SEQUENCE Test.CountBy1  
    START WITH 5  
    INCREMENT BY 5 ;  
GO  

D.D. Criando uma sequência que começa com um número designadoCreating a sequence that starts with a designated number

Depois de importar uma tabela, Thierry percebe que o número de ID mais alto usado é 24.328.After importing a table, Thierry notices that the highest ID number used is 24,328. Thierry precisa de uma sequência que gerará números que comecem em 24.329.Thierry needs a sequence that will generate numbers starting at 24,329. O código a seguir cria uma sequência que inicia com 24.329 e incrementos de 1.The following code creates a sequence that starts with 24,329 and increments by 1.

CREATE SEQUENCE Test.ID_Seq  
    START WITH 24329  
    INCREMENT BY 1 ;  
GO  

E.E. Criando uma sequência usando valores padrãoCreating a sequence using default values

O exemplo a seguir cria uma sequência que usa os valores padrão.The following example creates a sequence using the default values.

CREATE SEQUENCE Test.TestSequence ;  

Execute a instrução a seguir para exibir as propriedades da sequência.Execute the following statement to view the properties of the sequence.

SELECT * FROM sys.sequences WHERE name = 'TestSequence' ;  

Uma lista parcial da saída demonstra os valores padrão.A partial list of the output demonstrates the default values.

start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F.F. Criando uma sequência com um tipo de dados específicoCreating a sequence with a specific data type

O exemplo a seguir cria uma sequência usando o tipo de dados smallint, com um intervalo de -32.768 a 32.767.The following example creates a sequence using the smallint data type, with a range from -32,768 to 32,767.

CREATE SEQUENCE SmallSeq 
    AS smallint ;  

G.G. Criando uma sequência com todos os argumentosCreating a sequence using all arguments

O exemplo a seguir cria uma sequência chamada DecSeq usando o tipo de dados decimal, com um intervalo de 0 a 255.The following example creates a sequence named DecSeq using the decimal data type, having a range from 0 to 255. A sequência começa com 125 e é incrementada em 25 sempre que um número é gerado.The sequence starts with 125 and increments by 25 every time that a number is generated. Como a sequência é configurada para executar um ciclo quando o valor excede o valor máximo de 200, a sequência é reiniciada no valor mínimo de 100.Because the sequence is configured to cycle when the value exceeds the maximum value of 200, the sequence restarts at the minimum value of 100.

CREATE SEQUENCE Test.DecSeq  
    AS decimal(3,0)   
    START WITH 125  
    INCREMENT BY 25  
    MINVALUE 100  
    MAXVALUE 200  
    CYCLE  
    CACHE 3  
;  

Execute a instrução a seguir para visualizar o primeiro valor; a opção START WITH de 125.Execute the following statement to see the first value; the START WITH option of 125.

SELECT NEXT VALUE FOR Test.DecSeq;  

Execute a instrução mais três vezes para retornar 150, 175 e 200.Execute the statement three more times to return 150, 175, and 200.

Execute a instrução novamente para saber como o valor inicial volta para a opção MINVALUE de 100.Execute the statement again to see how the start value cycles back to the MINVALUE option of 100.

Execute o código a seguir para confirmar o tamanho do cache e visualizar o valor atual.Execute the following code to confirm the cache size and see the current value.

SELECT cache_size, current_value   
FROM sys.sequences  
WHERE name = 'DecSeq' ;  

Consulte TambémSee Also

ALTER SEQUENCE (Transact-SQL) ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL) DROP SEQUENCE (Transact-SQL)
NEXT VALUE FOR (Transact-SQL) NEXT VALUE FOR (Transact-SQL)
Números de sequênciaSequence Numbers