Resumo Executivo: O objeto SEQUENCE no SQL Server é um gerador de números independente de tabelas, ideal para cenários em que você precisa de um identificador compartilhado entre múltiplas entidades (ex.: Cliente e Funcionário) sem recorrer a “truques” com IDENTITY, GUIDs ou chaves compostas. Introduzido no SQL Server 2012, ele permite controlar início, incremento, mínimo/máximo, cache e ciclo, além de obter o próximo valor com NEXT VALUE FOR — inclusive antes do INSERT.
Pontos-chave
- SEQUENCE: gera números fora do escopo da transação — o valor é consumido mesmo em
ROLLBACK. - Independente de tabelas: diferente de
IDENTITY, pode alimentar várias tabelas com o mesmo gerador. - NEXT VALUE FOR: obtém o próximo número sem precisar inserir linha, útil para “pré-alocar” IDs.
- Cache & gaps: cache melhora performance, mas pode gerar lacunas em shutdown inesperado e em números solicitados e não usados.
SQL Server SEQUENCE: como gerar IDs compartilhados (e evitar armadilhas do IDENTITY)
Por muitos anos, modelagens que exigiam um identificador numérico compartilhado entre tabelas (por exemplo, um “Cadastro” comum para Cliente e Funcionário) acabavam dependendo de alternativas pouco elegantes: chaves compostas, GUIDs (UNIQUEIDENTIFIER) ou até “par/ímpar” com IDENTITY. A partir do SQL Server 2012, o objeto SEQUENCE simplifica esse cenário com um gerador central de números.
O que é SEQUENCE (e por que ele muda o jogo)
SEQUENCE é um objeto definido pelo usuário e associado a um schema que gera uma sequência de valores numéricos conforme regras (início, incremento, limites, ciclo e cache). Diferente de IDENTITY, ele não está preso a uma tabela: a aplicação (ou seu SQL) chama a sequência e decide onde usar o número, inclusive em várias tabelas.
Por que “truques” antigos eram problemáticos
- Chave composta: aumenta complexidade, consumo de armazenamento e dificulta consultas/joins e manutenção.
- UNIQUEIDENTIFIER + NEWID(): melhora unicidade, mas torna chaves “grandes” e pouco legíveis.
- IDENTITY par/ímpar: confunde auditoria e manutenção; deleções e assimetrias de inserts criam lacunas e padrões estranhos.
Comparativo: SEQUENCE vs alternativas
| Abordagem | Prós | Contras | Melhor uso |
|---|---|---|---|
| IDENTITY | Simples; automático no INSERT |
Amarrado à tabela; não “coordena” IDs entre tabelas | PK por tabela, sem necessidade de compartilhamento |
| SEQUENCE | Independente de tabelas; pode obter ID antes do INSERT; controla min/max, ciclo e cache |
Valor é consumido fora da transação (pode “perder” número em rollback) | IDs compartilhados entre tabelas; numeração centralizada |
| UNIQUEIDENTIFIER | Unicidade global; bom para integrações distribuídas | Mais pesado; menos legível; pode impactar indexação dependendo do padrão | Sistemas distribuídos, merge replication, integrações multi-site |
| Chave composta | Modelagem “pura” em alguns cenários | Complexa; aumenta colunas em FK/índices; dificulta manutenção | Casos onde a natural key é estável e pequena |
| IDENTITY par/ímpar | Evita colisão numérica entre duas tabelas | Dados confusos; lacunas e manutenção difícil | Evite (há opções melhores) |
Como criar uma SEQUENCE no SQL Server
A criação é feita com CREATE SEQUENCE, definindo tipo, início, incremento e limites. Exemplo “clássico” (incremento de 1, sem limite máximo explícito):
CREATE SEQUENCE dbo.CadastroSeq
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
CACHE 50;
Observação importante: o cache pode melhorar performance ao reduzir I/O, mas em desligamentos inesperados você pode perder números que ficaram em memória (o que gera lacunas).
Aplicando a SEQUENCE para “Cliente” e “Funcionário” (ID compartilhado)
A grande vantagem é centralizar a numeração. Veja um exemplo didático (simplificado):
-- Tabelas de exemplo
CREATE TABLE dbo.Cliente (
CadastroId INT NOT NULL PRIMARY KEY,
Nome NVARCHAR(120) NOT NULL
);
CREATE TABLE dbo.Funcionario (
CadastroId INT NOT NULL PRIMARY KEY,
Nome NVARCHAR(120) NOT NULL
);
-- Sequência compartilhada
CREATE SEQUENCE dbo.CadastroSeq
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
CACHE 50;
-- Inserts usando o próximo valor da sequência
INSERT INTO dbo.Cliente (CadastroId, Nome)
VALUES (NEXT VALUE FOR dbo.CadastroSeq, N'Fabrizzio');
INSERT INTO dbo.Funcionario (CadastroId, Nome)
VALUES (NEXT VALUE FOR dbo.CadastroSeq, N'Caputo');
O comando NEXT VALUE FOR permite obter o próximo número de forma explícita — inclusive sem inserir uma linha imediatamente.
Reservando ranges: quando você precisa “pré-alocar” blocos
Em cenários de alta concorrência, integração ou geração em lote, pode ser útil reservar um intervalo de valores. O SQL Server permite obter múltiplos números com sp_sequence_get_range.
Gerenciamento: ALTER SEQUENCE (reiniciar, mudar incremento, limites, cache)
Um benefício operacional é ajustar a sequência sem recriar tudo: você pode alterar propriedades e até reiniciar conforme necessidade (por exemplo, depois de uma carga).
-- Exemplo: reiniciar para 100000 (cuidado com colisões)
ALTER SEQUENCE dbo.CadastroSeq
RESTART WITH 100000;
-- Exemplo: mudar cache (impacta performance vs risco de gaps em shutdown)
ALTER SEQUENCE dbo.CadastroSeq
CACHE 200;
Armadilha crítica: SEQUENCE não “volta” com ROLLBACK
Aqui está a principal diferença comportamental que pega muita gente: números de SEQUENCE são gerados fora do escopo da transação. Isso significa que o valor é consumido mesmo que sua transação seja revertida.
CREATE SEQUENCE dbo.SeqTeste
AS INT
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;
BEGIN TRAN;
SELECT NEXT VALUE FOR dbo.SeqTeste AS PrimeiroValor; -- 1
ROLLBACK;
SELECT NEXT VALUE FOR dbo.SeqTeste AS SegundoValor; -- 2 (não volta para 1)
Além disso, lacunas também podem ocorrer se valores forem solicitados e não usados, e com cache em casos de desligamento inesperado.
Boas práticas para usar SEQUENCE com segurança
- Não prometa “sem lacunas”: trate SEQUENCE como gerador de unicidade/ordem, não como “contador perfeito” (gaps são esperados em cenários reais).
- Escolha o tipo correto:
BIGINTcomo padrão é comum;INTpode ser suficiente, mas valide crescimento. - Defina cache conscientemente: cache melhora performance;
NO CACHEreduz risco de gaps em shutdown, mas aumenta I/O. - Evite colisões: ao reiniciar (
RESTART), assegure que não há valores já usados nas tabelas alvo.
Onde se aprofundar (fonte oficial)
Para sintaxe completa, opções e observações de comportamento (transação, cache e lacunas), consulte a documentação oficial: CREATE SEQUENCE (Transact-SQL) – Microsoft Learn.
Se você está padronizando governança, performance e segurança no seu ambiente SQL Server (backup, monitoramento e boas práticas operacionais), vale olhar também os serviços gerenciados de TI da Tripletech e, se preferir, falar com um especialista para desenhar uma estratégia consistente do banco até a camada de infraestrutura.
Perguntas Frequentes
1) SEQUENCE substitui IDENTITY em qualquer caso?
Não necessariamente. IDENTITY continua ótimo quando o ID é exclusivo por tabela e você quer simplicidade no INSERT. SEQUENCE brilha quando você precisa coordenar IDs entre tabelas, obter o número antes do INSERT e controlar propriedades como min/max, ciclo e cache.
2) Posso garantir que não haverá lacunas?
Em prática, não. A própria documentação ressalta que números são consumidos fora da transação (mesmo com rollback) e que cache/shutdown e números solicitados e não usados podem gerar gaps.
3) SEQUENCE é transacional?
Não. Os números são gerados fora do escopo da transação e são consumidos independentemente de commit/rollback.
4) CACHE vale a pena?
Muitas vezes sim, por performance (menos I/O). Porém, considere o risco de lacunas em caso de falha/queda inesperada do servidor e o seu nível de exigência com a “contagem”.
5) Em qual versão do SQL Server isso existe?
O objeto SEQUENCE foi introduzido no SQL Server 2012.
Sua operação não pode parar. Proteja seu negócio hoje.
Se o seu ambiente SQL Server sustenta faturamento, atendimento ou integrações críticas, uma decisão simples (como padronizar SEQUENCE, backup, políticas de retenção e monitoramento) pode reduzir incidentes, acelerar troubleshooting e aumentar disponibilidade. A Tripletech ajuda a organizar boas práticas e operar seu TI com previsibilidade — do banco à infraestrutura.
Ir para o conteúdo




