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.
Wesley Mota
Latest posts by Wesley Mota (see all)
- Free Blackjack No Download: Appreciate Blackjack Anytime, Anywhere - novembro 25, 2024