Usuário com melhor resposta
Erro em insert num campo decimal - Arithmetic overflow error converting numeric to data type numeric.

Pergunta
-
Respostas
-
Fernando, acho que vale à pena um esclarecimento sobre o tipo de dados Decimal, segundo o BOL:
"Tipos de dados numéricos que têm precisão e escala fixos.
decimal(p [, s])
p (precisão)
O número máximo total de dígitos decimais que podem ser armazenados, à esquerda e à direita do ponto decimal. A precisão deve ser um valor de 1 até a precisão máxima de 38. A precisão padrão é 18.s (escala)
O número máximo de dígitos decimais que podem ser armazenados à direita do ponto decimal. A escala deve ser um valor de 0 a p. A escala somente poderá ser especificada se precisão também o for. A escala padrão é 0; portanto, 0 <= s < = p. Os tamanhos máximos de armazenamento variam, com base na precisão."Coloquei essa informação pelo seguinte:
Se você tem um campo Decimal (11,10), significa que o SQL só aceitará valores que tenham até 11 caracteres (sem contar o separador de casas decimais). E como você está passando "10" como escala, significa que o SQL sempre irá considerar 10 números na parte decimal.
Dessa forma, quando você tenta atribuir o valor "10" (ou 10.0) para o campo, como o SQL acrescenta as 10 casas decimais, dá um estouro de campo.
Se você fizer o teste abaixo, verá que o resultado possui 12 números (10.0000000000), mais do que o permitido num Decimal(11,10):
Declare @Valor Decimal(15,10)
Select @Valor = 10.0
Select @Valor
Ou seja, como seu tipo é um Decimal(11,10), ele só aceita até 11 números. Então, na verdade, qualquer número que você tentar atribuir para o seu campo que tiver duas casas (qualquer número maior que 10), dará erro.
Agora, se você testar com o número "9" (de uma casa somente), funcionará, ainda que seja com o Decimal(11,10):
Declare @Valor Decimal(11,10)
Select @Valor = 9.0
Select @Valor
A princípio, me parece que este tipo de dados com esta precisão e escala não é o que você precisa. Será que você sempre quer 10 casas decimais mesmo? Será que não seria um Decimal(11,2), por exemplo?
Ou você aumenta a precisão (11), ou diminui a escala (10).
Bem, agora você já sabe o porquê do problema e como funciona o tipo de dados Numeric. A decisão de o que fazer fica por sua conta, rs, porque depende do seu objetivo com este campo.
Um abs.
Roberson Ferreira - Database Developer
Se esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Sugerido como Resposta Luiz Phellipe segunda-feira, 30 de maio de 2011 02:48
- Marcado como Resposta Fernando T. Xavier segunda-feira, 30 de maio de 2011 04:27
Todas as Respostas
-
Fernando, acho que vale à pena um esclarecimento sobre o tipo de dados Decimal, segundo o BOL:
"Tipos de dados numéricos que têm precisão e escala fixos.
decimal(p [, s])
p (precisão)
O número máximo total de dígitos decimais que podem ser armazenados, à esquerda e à direita do ponto decimal. A precisão deve ser um valor de 1 até a precisão máxima de 38. A precisão padrão é 18.s (escala)
O número máximo de dígitos decimais que podem ser armazenados à direita do ponto decimal. A escala deve ser um valor de 0 a p. A escala somente poderá ser especificada se precisão também o for. A escala padrão é 0; portanto, 0 <= s < = p. Os tamanhos máximos de armazenamento variam, com base na precisão."Coloquei essa informação pelo seguinte:
Se você tem um campo Decimal (11,10), significa que o SQL só aceitará valores que tenham até 11 caracteres (sem contar o separador de casas decimais). E como você está passando "10" como escala, significa que o SQL sempre irá considerar 10 números na parte decimal.
Dessa forma, quando você tenta atribuir o valor "10" (ou 10.0) para o campo, como o SQL acrescenta as 10 casas decimais, dá um estouro de campo.
Se você fizer o teste abaixo, verá que o resultado possui 12 números (10.0000000000), mais do que o permitido num Decimal(11,10):
Declare @Valor Decimal(15,10)
Select @Valor = 10.0
Select @Valor
Ou seja, como seu tipo é um Decimal(11,10), ele só aceita até 11 números. Então, na verdade, qualquer número que você tentar atribuir para o seu campo que tiver duas casas (qualquer número maior que 10), dará erro.
Agora, se você testar com o número "9" (de uma casa somente), funcionará, ainda que seja com o Decimal(11,10):
Declare @Valor Decimal(11,10)
Select @Valor = 9.0
Select @Valor
A princípio, me parece que este tipo de dados com esta precisão e escala não é o que você precisa. Será que você sempre quer 10 casas decimais mesmo? Será que não seria um Decimal(11,2), por exemplo?
Ou você aumenta a precisão (11), ou diminui a escala (10).
Bem, agora você já sabe o porquê do problema e como funciona o tipo de dados Numeric. A decisão de o que fazer fica por sua conta, rs, porque depende do seu objetivo com este campo.
Um abs.
Roberson Ferreira - Database Developer
Se esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Sugerido como Resposta Luiz Phellipe segunda-feira, 30 de maio de 2011 02:48
- Marcado como Resposta Fernando T. Xavier segunda-feira, 30 de maio de 2011 04:27
-
Roberson, realmente faltou estudar um pouco melhor o tipo de dados decimal, o que eu precisava na verdade era um Decimal(21,10) pois o valor pode ter ate 11 casas antes da virgula e 10 depois, ex.: 12345678901,1234567890, ou seja precisao de 21 digitos e escala de 10.
Muito obrigado.
[]'s
Fernando T. Xavier -