sexta-feira, 26 de maio de 2017

Dica do Mês – Função Next Value For

Por Junior Galvão em 27/01/2016.

Estamos chegando ao final do primeiro mês de 2016, nossa janeiro já esta indo embora. Como eu havia prometido no início deste ano, dentro do possível vou tentar trazer novas sessões para o meu blog e hoje falo do lançamento ou melhor o retorno de uma delas que vou batizar de “Dica do Mês“, é isso mesmo, no final de cada vez vou trazer uma simples dica relacionada a algo que utililizei em minhas atividades profissionais e acadêmicas.
O objetivo desta sessão como seu próprio nome diz, é compartilhar com você leitor ou seguidor do meu blog, uma simples dica que poderá fazer toda diferença no seu dia-á-dia ou simplesmente mostrar como utilizar um determinado recurso, funcionalidade e produto existente no SQL Server.
Neste primeiro post, quero destacar uma função muito legal que foi introduzida no Microsoft SQL Server 2012 e que recentemente em diversas dúvidas nos fóruns brasileiros de SQL Server acabou sendo destaque como solução. Estou me referindo ao função Next Valeu For fazendo uma tradução ao pé da letra podemos dizer: Próximo Valor para.

Sobre Next Value For –  Função que possui a característica possibilitar a geração de uma sequência de números para uma objeto específico, neste caso, o objeto que refiro é Sequence Object, funcionalidade também introduzida a partir do Microsoft SQL Server 2012, em conjunto com diversas novidades relacionadas a geração de sequência de valores numéricos.
A Next Value For é reconhecida como uma função não-determinística, desta maneira o sua utilização é somente permitida em conjunto com o objeto sequence, sendo este responsável pela geração da sequência numérica repassada para a função.

Sintaxe – A função Next Value For possui uma forma de uso bastante simples, uma das suas particularidades é permitir o uso da função Over como opção para geração de valores dentro da sequência.
  • Exemplo da Sintaxe: NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name
    [ OVER (<over_order_by_clause>) ]

Argumentos – Com base em sua sintaxe podemos identificar quatro argumentos que formam sua estrutura de código, sendo eles:
  • database_name – Representa o nome do banco de dados que possui o objeto sequence;
  • schema_name –  Representa o nome do schema que contém o objeto sequence;
  • sequence_name – Representa o nome do objeto sequence responsável em armazenar e garantir a sequência numérica
  • Over_order_by_clause – Determina a ordem de organização e apresentação dos valores das linhas dentro de uma faixa de valores gerados pelo objeto sequence.

Exemplos: Vou destacar algumas maneiras de como utilizar a função Next Value For:
— Exemplo 1- Utilizando a função Next Valeu For para mostrar dois valores em sequência —
CREATE SCHEMA Test;
GO

CREATE SEQUENCE Test.Contador
START WITH 1
INCREMENT BY 1 ;
GO

SELECT NEXT VALUE FOR Test.Contador AS FirstUse;
SELECT NEXT VALUE FOR Test.Contador AS SecondUse;

Go

— Exemplo 2 – Utilizando a função Next Valeu For em conjunto com variável —
DECLARE @var1 bigint = NEXT VALUE FOR Test.Contador
DECLARE @var2 bigint ;
DECLARE @var3 bigint ;

SET @var2 = NEXT VALUE FOR Test.Contador ;
SELECT @var3 = NEXT VALUE FOR Test.Contador;
SELECT @var1 AS myvar1, @var2 AS myvar2, @var3 AS myvar3 ;
GO


— Exemplo 3 – Utilizando a função Next Valeu For em conjunto com constraint Default —
CREATE TABLE Test.MyTable
(
IDColumn nvarchar(25) PRIMARY KEY,
name varchar(25) NOT NULL) ;
GO

CREATE SEQUENCE Test.CounterSeq
AS int
START WITH 1
INCREMENT BY 1 ;
GO

ALTER TABLE Test.MyTable
ADD DEFAULT N’AdvWorks_’ + CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20)) FOR IDColumn;
GO

INSERT Test.MyTable (name) VALUES (‘Junior’) ;
INSERT Test.MyTable (name) VALUES (‘Galvão’) ;

INSERT Test.MyTable (name) VALUES (‘SQL’) ;
INSERT Test.MyTable (name) VALUES (‘Server’) ;
SELECT * FROM Test.MyTable;
GO


— Exemplo 4 – Utilizando a função Next Value For com ranking windows function —
Use AdventureWorks2012
Go
SELECT NEXT VALUE FOR Test.Contador OVER (ORDER BY LastName) AS ListNumber,
FirstName, LastName
FROM Person.Contact ;
GO


Nenhum comentário:

Postar um comentário