O dialeto SQL do SQL Server 2012, o Transact-SQL, vem com melhorias importantes, incluindo suporte para funções ANSI FIRST_VALUE e LAST_VALUE, paginação de resultados de alto nível usando FETCH e OFFSET e suporte a funções de parsing e de formatação do .NET.
Fetch e Offset
Atualmente, muitos desenvolvedores de SQL Server que desejam implementar paginação de resultados no lado do servidor precisam utilizar técnicas "imperativas" de programação, como carregar os resultados em uma tabela temporária, numerar as linhas e então selecionar o intervalo de interesse. Há também desenvolvedores que utilizam ROW NUMBER e OVER; outros utilizam cursores.
O SQL Server 2012 resolve essa limitação e permite mais consistência no uso, adicionando suporte declarativo para a paginação de resultados, através das novas opções OFFSET e FETCH NEXT do Transact-SQL. Mas note que atualmente não há otimização de performance; o SQL Server está fazendo a mesma coisa que os desenvolvedores fariam manualmente.
Clause Windowing
Às vezes, os desenvolvedores precisam escrever consultas que identificam diferenças entre linhas. Por exemplo, pode-se estar interessado na quantidade de tempo entre o timestamp de uma linha e outra. Isso é fácil de fazer utilizando cursores, mas o desempenho e elegância dessa solução deixam a desejar. É possível ainda utilizar uma subquery executada linha a linha, mas isso é extremamente custoso. Pode-se ainda implementar tudo no lado do cliente mas isso não funcionaria se o cliente for uma ferramenta de geração de relatórios, por exemplo.
No SQL Server 2012, agora é possível acessar diretamente a linha anterior utilizando a função LAG. O analisador de consultas SQL retém a linha anterior na memória, de forma que não há necessidade de uma subquery. Isso resulta em melhor desempenho. A função LAG aponta para a linha anterior, mas é possível utilizar um offset para ter acesso a linhas anteriores. A função LEAD é equivalente a LAG, mas trabalha com linhas posteriores à que está sendo lida. As funções LAG e LEAD, que são parte do padrão ANSI, eram um pedidas pelos desenvolvedores desde a implementação da sintaxe OVER no SQL Server 2005. As funções FIRST VALUE e LAST VALUE também estão disponíveis no SQL Server 2012.
Reflection
Anteriormente, para testar quais os resultados seriam retornados por stored procedures ou consultas SQL, utilizava-se o comando SET FMTONLY. Esse comando permitia aos desenvolvedores visualizar as colunas retornadas, sem a necessidade de executar uma consulta SQL. Mas a informação se limitava apenas às definições das colunas resultantes da execução da consulta.
Com a nova procedure sp describe first result set, os desenvolvedores podem obter informações detalhadas a respeito de quais resultados seriam retornados pela consulta. Essas informações incluem tipos de dados, tabelas ou colunas-fonte e outras informações importantes, também disponíveis nas telas de gerenciamento dinâmico, sys.dm exec describe first result e sys.dm exec describe first result set.
Código Defensivo
Tradicionalmente, os desenvolvedores ficam à mercê de seus colegas quando utilizam stored procedures. Sem garantias em relação ao que será retornado, falhas acidentais se tornam uma preocupação. O T-SQL não oferece formas de prevenir esses erros, mas é possível minimizá-los utilizando a opção RESULT SETS.
Quando usada, a opção RESULT SETS faz com que a procedure armazenada retorne uma estrutura específica de dados. Se os resultados da procedure forem diferentes do requisitado, a opção retorna um erro. Considerando que se trata de um erro em tempo de de execução, recomenda-se aos desenvolvedores que utilizarem essa opção se assegurem de que os erros sejam depurados antes do código ir para produção.
Tratamento de Erros
O T-SQL tem suporte para TRY-CATCH desde 2005, porém o suporte THROW não existia até agora. Sem argumentos, THROW funciona da mesma maneira que em C# ou VB. Isto é, THROW retorna uma exceção e mantém o log de informação capturada sobre o erro, o que é muito útil.
Quando utilizada com argumentos, THROW é similar à RAISERROR, exceto por não suportar números de erros em sys.messages e a severidade é sempre 16. Além disso, os erros não detectados por THROW sempre terminam a execução.
Parsing e Conversões
O T-SQL agora suporta a função PARSE que inclui a opção de especificar uma "culture". Esta deve contar com suporte pelo framework .NET. Há também uma nova função TRY_CONVERT que, assim como TRY_PARSE, retorna null quando a conversão falha. Já a função FORMAT utiliza a formatação de strings do .NET. Apesar de mais lenta que as funções nativas como STR, é mais flexível.
Funções de Data e Hora
O processamento de data e hora no T-SQL recebeu melhorias. A função EOMONTH retorna o último dia do mês, dado importante para relatórios. As funções xxxFROMPARTS permitem construir valores de data/hora utilizando um conjunto de parâmetro em vez de apenas uma string. Há suporte para os tipos de dados Date, DateTime, DateTime2, DateTimeOffset, SmallDate e Time.
Outras funções
A função Choose do Access e Visual Basic agora está presente no T-SQL. Sob determinadas circunstâncias, pode ser utilizada como uma versão simplificada de CASE. Também está presente a função IIF.
A função CONCAT pode ser utilizada para concatenar strings. Além de tornar mais fácil a portabilidade de código de outras linguagens, essa função possui um tratamento de exceção diferente do operador +. Itzik Ben-Gan escreve:
O operador + de concatenação devolve NULL para inputs NULL. A função CONCAT converte inputs NULL em strings vazias antes da concatenação. Embora esta não seja uma boa solução, é possível fazer a mesma coisa utilizando a função COLAESCE, substituindo entradas NULL por strings vazias.