skip to Main Content

SEQUENCE no SQL Server – Parte 1

Além da propriedade IDENTITY para o auto-incremento de valores, o SQL Server possui outro recurso similar ao Oracle: SEQUENCE.  Para criar uma SEQUENCE utilizamos o comando CREATE SEQUENCE, veja:

CREATE SEQUENCE Contador AS int 
MINVALUE 1 NO MAXVALUE START WITH 1

No comando acima foi criada uma SEQUENCE que inicia com o valor 1 e incremento de 1.   Para testar execute o script abaixo:

SELECT NEXT VALUE FOR dbo.Contador as ClienteID
UNION ALL SELECT NEXT VALUE FOR dbo.Contador
UNION ALL SELECT NEXT VALUE FOR dbo.Contador

Resultado:

ClienteID
———–
1
2
3

Para alterar o incremento para 5 basta utilizar o ALTER SEQUENCE e executar o mesmo SELECT acima para testar, veja:

ALTER SEQUENCE dbo.Contador RESTART WITH 1 INCREMENT BY 5;

SELECT NEXT VALUE FOR dbo.Contador as ClienteID
UNION ALL SELECT NEXT VALUE FOR dbo.Contador
UNION ALL SELECT NEXT VALUE FOR dbo.Contador

Resultado:

ClienteID
———–
1
6
11

O SEQUENCE possui o mesmo comportamento do IDENTITY com relação a gaps na sequência de números gerados, no caso de ROLLBACK de uma transação, veja no exemplo abaixo:

ALTER SEQUENCE dbo.Contador RESTART WITH 1 INCREMENT BY 1;

BEGIN TRAN
  SELECT NEXT VALUE FOR dbo.Contador as ProximoID;
ROLLBACK
SELECT ProximoID = NEXT VALUE FOR dbo.Contador;

O primeiro SELECT retorna 1 e o segundo 2, mesmo ocorrendo um ROLLBACK após o primeiro SELECT!

Quando utilizamos o IDENTITY temos a função IDENT_CURRENT() para retornar o valor corrente do IDENTITY em uma tabela, com o SEQUENCE execute o SELECT abaixo:

SELECT current_value FROM sys.sequences WHERE name = 'Contador'

Utilizar o SEQUENCE para gerar números seqüenciais automaticamente em uma tabela é muito simples veja:

CREATE SEQUENCE dbo.SEQ_Clientes AS int 
MINVALUE 1 NO MAXVALUE START WITH 1;

CREATE TABLE dbo.Clientes 
(ClienteID int not null DEFAULT NEXT VALUE FOR SEQ_Clientes,
Nome varchar(50) not null)
go
INSERT dbo.Clientes (Nome) VALUES ('Jose')
INSERT dbo.Clientes (Nome) VALUES ('Ana')
INSERT dbo.Clientes (Nome) VALUES ('Maria')

SELECT * FROM dbo.Clientes

Indicações de uso

  • A aplicação necessita saber o número antes de o INSERT ocorrer.
  • A aplicação precisa compartilhar uma única numeração sequencial entre tabelas.
  • Existe a necessidade de obter números seqüenciais (sem gap) para um conjunto de linhas (utilizar a Stored Procedure sp_sequence_get_range).

Até o próximo post.
Landry

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Back To Top