No post de hoje, vou compartilhar com vocês uma pesquisa que venho fazendo já há algum tempo, sobre os novos recursos do SQL Server a cada versão, com o foco nos desenvolvedores de query e rotinas de banco de dados. Nos ambientes que trabalho, vejo que muitos acabam “reinventando a roda” ou criando funções UDF para realizar determinadas tarefas (as quais sabemos que são péssimos para performance) quando o próprio SQL Server já provê soluções nativas para isso.
Meu objetivo nesse post é ajudar a você, que está utilizando versões antigas do SQL Server, a avaliar quais as vantagens e novos recursos (apenas na visão do desenvolvedor) que você terá acesso ao atualizar seu SQL Server.
A minha ideia inicial era criar um post só com tudo o que foi alterado do 2008 até o 2019, mas após conversar e receber alguns feedbacks de grandes profissionais que eu considero, como o Edvaldo Castro, Nilton Pinheiro, Caio Amante e o Ariel Fernandez, vou, pela primeira vez no blog, iniciar uma série de posts, de modo que o artigo não fique muito grande e cansativo de ler..
Sendo assim, inicio a série “O que mudou no SQL Server X em relação ao T-SQL – Na visão dos Desenvolvedores”, começando pelo SQL Server 2008 e vou divulgando um post para cada versão até chegar no 2019. Após todos os artigos publicados, vou criar um artigo pra centralizar toda essa série.
SQL Server – O que mudou no T-SQL na versão 2008 ?
Novos tipos de dados: date, time, datetime2, datetimeoffset
Visualizar conteúdo
Na versão 2008, o SQL Server nos apresenta novos tipos de dados para tratar com data e hora. Antes do SQL Server 2008, existia o campo DATETIME, mas para trabalhar com horas não existia tipo de dado específico para isso.
Para pegar um campo DATETIME e retornar apenas a parte da data, sem a hora, uma das soluções (e bem comum) era usando a técnica de CFC (Cast, Floor, Cast):
Atualmente, isso é bem mais simples utilizando o tipo DATE:
E vou demonstrar um pouco sobre os outros tipos de dados:
Recursos disponível desde o SQL Server 2008, agora podemos declarar tipos com estruturas de tabela e utilizar como parâmetros em SP’s e funções, conforme exemplo abaixo:
Transact-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
-- Cria o tipo tpPessoa
CREATETYPEdbo.tpPessoaASTABLE(
Namevarchar(100),
IdadeINT,
Dt_NascimentoDATE
)
GO
-- Cria uma procedure que você irá receber como parâmetro uma variável do tipo tpPessoa
CREATEPROCEDUREdbo.stpExibe_Pessoa (
@PessoatpPessoaREADONLY
)
AS
BEGIN
SELECT*
FROM@Pessoa
END
GO
-- Instancia uma variável @Variavel_Pessoa, do tipo tpPessoa, popula os dados e executa a SP stpExibe_Pessoa
Atribuir valores durante a declaração de variáveis
Visualizar conteúdo
A partir do SQL Server 2008, é possível atribuir valores já na declaração de variáveis, facilitando e reduzindo a quantidade de linhas de código necessárias.
Exemplos de uso:
Obs: Essa funcionalidade não é aplicada às variáveis do tipo TEXT, NTEXT e IMAGE.
Agrupamento de dados com GROUPING SETs
Visualizar conteúdo
Um recurso muito bem recebido a partir do SQL Server 2008, é a utilização de GROUPING SETS, CUBE e ROLLUP para criar agrupamentos de dados, totais e sub-totais de forma simples e com poucas alterações na sua query original.
Utilização do MERGE para INSERT, DELETE e UPDATE com apenas 1 comando
Visualizar conteúdo
A partir do SQL Server 2008, agora é possível utilizar o comando MERGE para INSERT, DELETE e UPDATE com apenas 1 instrução SQL. Seu funcionamento é simples: Uma ou mais colunas das tabelas envolvidas são consideradas chaves (identificadores) para caso o valor da chave exista na tabela destino, os valores serão atualizados de acordo com a tabela origem. Caso esse identificador não exista, esse registro será inserido na tabela destino.
A partir do SQL Server 2008, agora é possível inserir múltiplos valores em 1 único comando de INSERT com VALUES. Embora já era possível fazer isso utilizando INSERT… SELECT, esse recurso ajuda bastante durante o dia a dia.
Exemplo de uso:
Transact-SQL
1
2
3
4
5
INSERTINTOcontacts
VALUES
('John Doe','425-333-5321'),
('Jane Doe','206-123-4567'),
('John Smith','650-434-7869')
Vale lembrar a quantidade máxima de valores que podem ser inseridos em um único INSERT é de 1.000 registros.
Uso de operadores de atribuição de valores compostos
Visualizar conteúdo
A partir do SQL Server 2008, podemos utilizar operadores de atribuição de valores compostos, que são esses:
+= Adicionar e atribuir valor
-= Substrair e atribuir valor
*= Multiplicar e atribuir valor
/= Dividir e atribuir valor
%= Modulo e atribuir valor
&= Bitwise AND e atribuir valor
^= Bitwise XOR e atribuir valor
|= Bitwise OR e atribuir valor
Exemplos de uso:
Tipos de dados Espaciais
Visualizar conteúdo
O SQL Server 2008 introduziu os tipo de dados especiais (spatial datatypes) no SGBD, o que nos permite representar a localização física ou formato de qualquer figura geométrica, utilizando apenas T-SQL. Podemos utilizar esse tipo de dados para representar países, ruas, cidades, etc. Esses tipos de dados são implementados utilizando o .NET Common Language Runtime (CLR).
Quando preciso manipular parte de expressões data&hora e não há função nativa eu utilizo a fórmula “origem dos tempos”. Por exemplo, para zerar o horário seria assim:
dateadd (day, datediff (day, 0, DataHora), 0)
Ela é útil quando necessitamos de obter, por exemplo, somente o dia e as horas (desprezando minutos e segundo):
dateadd (hour, datediff (hour, 0, DataHora), 0)
Também funciona para obter final do mês, início do mês etc.