[SQL 2012] Novas Funções
Aprenda sobre as novas funções do SQL
Neste post veremos novas funções do SQL 2012  - Conversion, Logical, String e Date/Time
1) CONVERSION FUNCTIONS - PARSE, TRY_PARSE e TRY_CONVERT
Vamos começar com a função PARSE. É parecida com a Convert, mas tem algumas particularidades, o parâmetro de entrada deve ser uma string e na saÃda você pode definir a cultura.
1.1) PARSE
Vamos executar estes comandos:
Select PARSE('0.02315' as money)Â
Select PARSE('002315' as int)Â
select datename(month,(PARSE('5/12/2012' as datetime using 'pt-br')))Â
select datename(month,(PARSE('5/12/2012' as datetime using 'en-us')))Â
select PARSE('30/12/2012' as date using 'pt-br')Â

1.2) TRY_PARSE
O comando abaixo retorno um erro, para nos ajudar no tratamento foi criado o comando TRY_PARSE que retorna null em caso de erro.
select PARSE('30/12/2012' as datetime)
select TRY_PARSE('30/12/2012' as datetime)
1.3) TRY_CONVERT
Caso o valor origem não seja uma string, continue usando o CONVERT.
porém agora existe o TRY_CONVERT, que assim como o TRY_PARSE, retorna NULL em caso de erro.
Quando é uma conversão permitida, mas com erro, ele retorna null
select TRY_CONVERT(int, '4s')
Quando é uma conversão não permitida, ele retorna erro
select TRY_CONVERT(xml, 4)

2)LOGICAL FUNCTIONS - CHOOSE, IIF
2.1) CHOOSE
O comando CHOOSE é uma forma mais limpa de fazer um CASE, ele utiliza valores sequenciais a partir de 1.
Declare @Cargo int
Set @Cargo=2
ANTIGO:
Select CASE When @Cargo=1 then 'Estagiário'Â
    When @Cargo=2 then 'Analista'Â
    When @Cargo=3 then 'Coordenador'
    When @Cargo=4 then 'Gerente'
ENDÂ
NOVO:
Select CHOOSE(@Cargo, 'Estagiário','Analista','Coordenador','Gerente')Â

Como ele não tem o ELSE, podemos ajustar com o ISNULL:
Select ISNULL(CHOOSE(@Cargo, 'Estagiário', 'Analista', 'Coordenador', 'Gerente'), 'Sem Valor')
2.2) IIF
O comando IIF é um velho conhecido e finalmente chegou ao SQL Server.
Ele utiliza a estrutura IF-THEN-ELSE, mas de uma forma mais limpa.
IIF(Condição, se verdadeiro, se falso)
IIF(Condição, se verdadeiro, se falso)
Declare @Cargo int
Set @Cargo=2
ANTIGO:
IF @Cargo=4
   Print 'Gerente'
ELSE
   Print 'Outro'
NOVO:
PRINT IIF(@Cargo=4,'Gerente','Outro')
Na parâmetro condição, também pode ser usado IN, Like, Exists, etc
3) STRING FUNCTIONS
3.1) CONCAT - Resulta a concatenação de vários argumentos
Criação do Ambiente de Teste:
Create table Funcoes
(
Codigo int identity primary key,
Nome varchar(50),
Sobrenome varchar(50)
)
INSERT INTO Funcoes VALUES('José','Antonio'), ('Maria','Silva'), ('Pedro','Souza'), ('Carlos',NULL), ('João',NULL)
GO
Antes utilizávamos o operador "+" para concatenar, ficava desta forma:
Select 'Nome Completo: ' + Nome + ' ' + Sobrenome + '- Data: ' + convert(varchar,GETDATE()) as Coluna from Funcoes

Porém, ao concatenar com NULL ele retorna NULL.
Para corrigir isto, vamos utilizar o comando CONCAT_NULL_YIELDS_NULL.
SET CONCAT_NULL_YIELDS_NULL OFF -- Para concatenar com nulo
Select 'Nome Completo: ' + Nome + ' ' + Sobrenome + '- Data: ' + convert(varchar,GETDATE()) as Coluna from Funcoes
Agora podemos o utilizar a função CONCAT, além de ficar mais limpo, não foi preciso conversão e nem configurar o CONCAT_NULL_YIELDS_NULL.
Select CONCAT('Nome Completo: ', Nome, ' ', Sobrenome, '- Data: ', GETDATE()) Coluna from Funcoes

3.2) FORMAT
Mais uma alternativa para o Convert e o Cast. Utiliza a cultura do .Net Framework.
Mais uma alternativa para o Convert e o Cast. Utiliza a cultura do .Net Framework.
Neste exemplo formateremos com o parâmetro "d"(Data) e o "c"(Moeda)
Declare @Hoje date = getdate()
Select Format(@Hoje, 'd', 'en-us')Â
Select Format(@Hoje, 'd', 'pt-br')
Declare @Valor money = 100
Select Format(@Valor, 'c', 'en-us')Â
Select Format(@Valor, 'c', 'pt-br')Â
Select Format(@Valor, 'c', 'fr-fr')

4) DATE AND TIME FUNCTIONS
4.1) DATEFROMPARTS
Monta uma data. Parâmetros: (YEAR, MONTH, DAY)
Monta uma data. Parâmetros: (YEAR, MONTH, DAY)
SELECT DATEFROMPARTS(2012,4,11) as DATEFROMPARTS
4.2) TIMEFROMPARTS - Monta uma hora completa. Parâmetros: (HOUR, MINUTE, SECONDS, FRACTIONS, PRECISION)
O Parâmetro FRACTIONS depende de PRECISION. A quantidade de dÃgitos do FRACTIONS deve ser igual ao valor de PRECISION.
SELECT TIMEFROMPARTS(18, 16, 32, 300, 3) as TIMEFROMPARTS
4.3) DATETIMEFROMPARTS - Monta uma data/hora completa. Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE, SECONDS, MILLISECONDS)
SELECT DATETIMEFROMPARTS(2011,3,25,21,5,32,122) as DATETIMEFROMPARTS
4.4) SMALLDATETIMEFROMPARTS - Monta uma data/hora. Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE)
SELECT SMALLDATETIMEFROMPARTS(2012,6,4,14,35) as SMALLDATETIMEFROMPARTS
4.5) DATETIME2FROMPARTS - Monta uma data/hora completa Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE, SECONDS, FRACTIONS, PRECISION)
SELECT DATETIME2FROMPARTS(2012,4,11,18, 16, 32, 300, 3) as DATETIME2FROMPARTS
4.6) DATETIMEOFFSETFROMPARTS - Monta uma data/hora completa com Fuso Horário. Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE, SECONDS, FRACTIONS, HOUR_OFFSET, MINUTE_OFFSET, PRECISION)
SELECT DATETIMEOFFSETFROMPARTS(2012,4,11,18, 16, 32, 300, 3,30,3) as DATETIMEOFFSETFROMPARTS
4.7) EOMONTH - Retorna o último dia de um mês. Parâmetros: (START_DATE, [, MONTH_TO_ADD ])
SELECT EOMONTH (Getdate()) AS EsteMes, EOMONTH (Getdate(), 1) AS ProximoMes, EOMONTH (Getdate(), -1) AS MesAnterior

Subscribe ecode10.com
Receive our latest updates about programming languages, software, database, books, ebooks, classes, jobs and more.
You can cancel anytime.
Log In
Related articles
SELECT Format Date Time for many countries
It is a good tip to use day by day
Creating a SiteMap using SQL Database
Como indexar melhor meu site e links?
Transformando linhas em colunas usando SQL Server
veja como funciona