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.
[sourcecode language=”sql”]
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
[/sourcecode]
Após executar o script de criar a tabela, será criada a sequence que é o foco principal do post.
[sourcecode language=”sql”]
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
[/sourcecode]
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:
[sourcecode language=”sql”]
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
[/sourcecode]
Enfim o resultado do insert que foi realizado fazendo o uso da sequence.
[sourcecode language=”sql”]
SELECT * FROM T_SEQUENCE;
GO
[/sourcecode]
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.
Show de bola!! Parabéns pelo blog!
é possível criar uma function ou procedure que retorne o numero dessa sequence ?
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’)