SQL Server Administração

CAST E CONVERT: Conversões Decimais De Alteração do SQL Server

CAST E CONVERT: Conversões Decimais De Alteração do SQL Server

Ao realizar cálculos simples dentro do SQL Server usando decimais, você pode observar o que pode parecer um comportamento estranho com o tipo de dados resultante. Em vez de retornar o formato decimal desejado, o SQL Server gera um formato decimal totalmente diferente. Nesta dica, veremos o problema e como resolver isso com o CAST e CONVERT.

Para resolver esse problema, você pode usar as funções CAST e CONVERT para garantir que esteja retornando o tipo de dados correto. Vou percorrer um exemplo do problema e como isso pode ser resolvido.

Solução: Funções CAST e CONVERT

O SQL Server fornece muitos tipos de dados diferentes para seu uso. Muitas pessoas que são novas no SQL Server podem não estar cientes de que, dependendo do código, podem ter conversões implícitas, resultando em resultados inesperados.

Por exemplo, o código a seguir é algo que você pode encontrar em um momento ou outro:

DECLARE @var1 decimal(18,2), @var2 decimal(18,2)<br>SET @var1 = 1234567891234567.87<br>SET @var2 = 222.13<br>SELECT @var1/@var2 as 'Resultado'

O resultado final deste código é o seguinte:

Resultado 
5557862023295.22293251699455273938

O resultado não é mais um tipo de dados decimal (18,2). Isso pode ou não ser um problema. Depende da natureza do aplicativo e do que acontece depois que o resultado é retornado.

No entanto, este é frequentemente o momento em que eu vou ouvir alguém comentar sobre como o SQL Server “não está funcionando certo” e apontar para o resultado e, em seguida, dizer ao DBA para “ir corrigir o problema”.

A verdade é que o MS SQL está funcionando exatamente como esperado, embora seja difícil encontrar a documentação para esse comportamento. Nesse caso específico, você deseja examinar a entrada do MSDN para “Precisão, escala e comprimento.”

Revisando os detalhes no documento mencionado acima, você descobrirá que o comportamento é exatamente o esperado.

No exemplo acima, estamos fazendo a divisão de dois tipos de dados decimais (18,2).

Em nosso exemplo, temos p1 e p2 = 18 e s1 e s2 = 2. Isso significa que a precisão para nosso resultado será a seguinte, com base na fórmula encontrada no artigo do MSDN mencionado acima:

p1 - ​​s1 + s2 + max (6, s1 + p2 + 1) = 18 - 2 + 2 + max (6, 2 + 18 + 1) = 18 + 21 = 39

No entanto, a precisão máxima permitida é 38.

Além disso, a escala para o nosso resultado será simplesmente:

max (6, s1 + p2 + 1) = max (6, 2 + 18 + 1) = 21

Como tivemos que reduzir nossa precisão em um de 39 para 38, também reduziremos nossa escala de 21 para 20. Portanto o tipo de dados para o resultado será decimal (38,20). Bem diferente do decimal (18,2) com o qual começamos.

Você pode evitar problemas como esse usando as funções CAST ou CONVERT dentro do MS SQL Server.

Então, qual usar? Minha preferência é usar CAST sempre que possível, pois o CONVERT é uma função específica do MS SQL Server.

Isso significa que, se você usar CAST, seu código será mais portátil (ou, em outras palavras, seu código funcionará em mais de uma plataforma). No entanto, CAST não pode ser usado para fins de formatação, para isso você precisará usar o CONVERT.

Em nosso exemplo, o código final que gostaríamos de ter é o seguinte:

DECLARE @var1 decimal(18,2), @var2 decimal(18,2)
SET @var1 = 1234567891234567.87
SET @var2 = 222.13
SELECT CAST(@var1/@var2 as decimal(18,2)) as 'Resultado'

Isso garantirá que tenhamos o tipo de dados desejado para o nosso resultado, que é:

Resultado
5557862023295.22

Por fim, verifique se você está obtendo o tipo de dados correto retornado ao executar conversões decimais e use CAST quando possível.

CAST E CONVERT: Conversões Decimais De Alteração do SQL Server
The following two tabs change content below.

Wesley Mota

DBA SQL Server
Profissional graduado em Banco de Dados e Sistemas de Informação com mais de 7 anos de experiência em empresas de software. Certificado MCSA Microsoft SQL Server possui intensa vivência em administração de banco de dados, Tunning, Performance SQL Server, levantamento de melhorias e monitoramento de banco de dados e servidores SQL Server. Consultoria SQL Server em diversos clientes no Brasil e ao redor do mundo. Escritor no blog dbasqlserverbr.com.br/blog. Onde compartilha conhecimento, experiências e dicas de performance para DBAs SQL Server. Conhecimentos em Oracle e ambientes de alta disponibilidade. Desenvolvimento de softwares web e mobile.Gerenciamento de equipe e projetos.

Latest posts by Wesley Mota (see all)