Um dos bons recursos que o SQL Server apresentou a partir da versão 2012 foi a opção de criar sequence no banco de dados, assim  como seu concorrente direto Oracle já faz.

Nesse post será visto como criar uma sequence no SQL Server, como fazer o uso da mesma em um insert, enfim, explicar todo o funcionamento do novo recurso.

Primeiramente, será criado uma tabela simples a qual a sequence será associada posteriormente.

IF (OBJECT_ID('dbo.T_SEQUENCE')) IS NOT NULL
	DROP TABLE T_SEQUENCE;	

CREATE TABLE T_SEQUENCE
(
	CD_SEQ INT NOT NULL PRIMARY KEY,
	DS_SEQ VARCHAR(50)
);

GO

Após executar o script de criar a tabela, será criada a sequence que é o foco principal do post.

IF (OBJECT_ID('dbo.S_T_SEQUENCE')) IS NOT NULL
	DROP SEQUENCE S_T_SEQUENCE;

GO

CREATE SEQUENCE S_T_SEQUENCE
AS INT
START WITH 1
INCREMENT BY 1;

GO

A sequence é composta pelo seu respectivo nome ‘CREATE SEQUENCE S_T_SEQUENCE‘, qual o tipo de dados ‘AS INT‘, qual seu valor inicial ‘START WITH 1‘ e o valor que será incrementado ‘INCREMENT BY 1‘ seja ele de 1 em 1 ou de 2 em 2.

Pronto, sequence criada, agora como fazer um insert em uma tabela fazendo o uso da sequence criada?

A diferença é basicamente que no lugar de informar um valor para o campo “CD_SEQ” de forma manual, basta informar “NEXT VALUE FOR S_T_SEQUENCE“, assim cada vez que realizar o insert com “NEXT VALUE FOR S_T_SEQUENCE” o valor da sequence será incrementado, exemplo do insert utilizando a sequence:

INSERT INTO T_SEQUENCE (CD_SEQ, DS_SEQ)
VALUES	(NEXT VALUE FOR S_T_SEQUENCE, 'T-SQL'),
		(NEXT VALUE FOR S_T_SEQUENCE, 'TSQL'),
		(NEXT VALUE FOR S_T_SEQUENCE, 'T_SQL');

GO

Enfim o resultado do insert que foi realizado fazendo o uso da sequence.

SELECT * FROM T_SEQUENCE;

GO

SEQUENCE_SQL_SERVER

 

 

 

 

A mesma sequence pode ser utilizada em várias tabelas diferentes, pois, não existe uma sequence para uma tabela e sim uma sequence para N tabelas, porém, não é uma boa pratica fazer o uso de uma mesma sequence em tabelas diferentes, o ideal e mais organizado é uma sequence para cada tabela.

 


3 comentários

Thiago Oliveira · 27 de maio de 2016 às 16:46

Show de bola!! Parabéns pelo blog!

rafael · 21 de setembro de 2016 às 13:09

é possível criar uma function ou procedure que retorne o numero dessa sequence ?

    Ruberlei · 23 de setembro de 2016 às 14:04

    Bom dia tudo bem?

    Sim é possível, segue abaixo o exemplo.

    CREATE FUNCTION F_VALOR_CORRENTE(@V_NOME_SEQUENCE VARCHAR(30))
    RETURNS INT
    AS
    BEGIN
    DECLARE @V_VALOR_CORRENTE INT;

    SELECT @V_VALOR_CORRENTE = CONVERT(INT, CURRENT_VALUE)
    FROM SYS.SEQUENCES
    WHERE NAME = @V_NOME_SEQUENCE;

    RETURN @V_VALOR_CORRENTE
    END

    SELECT DBO.F_VALOR_CORRENTE(‘S_T_SEQUENCE’)

Deixe uma resposta

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