segunda-feira, 28 de novembro de 2011

Sequence no SQL Server 2012

Aproveitando o tema abordado pelo colega Miguel sobre “Alterar valor de uma Sequence” , vou comentar que na versão do SQL Server 2012 foi incluído este recurso já tão utilizado no Oracle.

Para quem não conhece a sequence é um contador que gera valores normalmente utilizados para inicializar chaves primárias de tabelas, seguindo critérios estabelecidos no momento da criação da sequence.

Uma das vantagens sobre colunas do tipo Identity é que uma sequence pode ser utilizada por várias tabelas.

Sintaxe:

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

Para explicar o funcionamento deste recurso vou utilizar o exemplo abaixo:
Considere uma tabela com dois campos: MesAno e TotalSalario que não possui chave, vamos incluir uma coluna ID do tipo inteiro, e colocaremos como valor default o valor atual de uma Sequence (IdSalarios) criada abaixo. Também serão atualizados todos os registros previamente existentes com um valor da sequence:

-- Script de criação da Tabela

CREATE TABLE [dbo].[TotalSalarios](
       [MesAno] [datetime] NOT NULL,
       [TotalSalario] [decimal](11, 2) NULL);

MesAno
TotalSalario
2011-01-01 00:00:00.000
89500.00
2011-02-01 00:00:00.000
91200.00
2011-03-01 00:00:00.000
93200.00
2011-04-01 00:00:00.000
97200.00
2011-05-01 00:00:00.000
101250.00
2011-06-01 00:00:00.000
103000.00
2011-07-01 00:00:00.000
103000.00
2011-08-01 00:00:00.000
105020.00
Tabela 1 - Conteúdo atual da tabela
 
-- Criação da Sequence com o nome IdSalarios

CREATE SEQUENCE dbo.IdSalarios AS INT
   MINVALUE 1     -- Menor valor da Sequence
   MAXVALUE 10000 --  Maior valor da sequence 
   START WITH 1   -- Valor inicial da Sequence
   CYCLE;         -- Indica para a sequence reiniciar do menor
                  -- valor (1) quando atingir o
                  -- maior valor (10000)

-- Criação da coluna ID
Alter Table TotalSalarios Add ID int;
 
-- Criando uma constraint para definir o valor da sequence como valor default da coluna ID
ALTER TABLE TotalSalarios 
  ADD CONSTRAINT Seq_IDSalarios DEFAULT (NEXT VALUE FOR IdSalarios) FOR Id
 
-- Inicializando os valores existentes com o próximo valor da sequence
Update TotalSalarios
   set ID = Next Value For IdSalarios;
 
-- Inserindo um registro novo deixando sem informar valor para ID
Insert into TotalSalarios (MesAno, TotalSalario) Values('2011-09-01',11000);


MesAno
TotalSalario
2011-01-01 00:00:00.000
89500.00
2011-02-01 00:00:00.000
91200.00
2011-03-01 00:00:00.000
93200.00
2011-04-01 00:00:00.000
97200.00
2011-05-01 00:00:00.000
101250.00
2011-06-01 00:00:00.000
103000.00
2011-07-01 00:00:00.000
103000.00
2011-08-01 00:00:00.000
105020.00
2011-09-01 00:00:00.000
11000.00
Tabela 2 - Conteúdo final da tabela

Nenhum comentário:

Postar um comentário