none
Erro em insert num campo decimal - Arithmetic overflow error converting numeric to data type numeric. RRS feed

  • Pergunta

  • Pessoal to tomando esse erro dando insert num campo do tipo Decimal(11, 10) num valor 10.0

    Arithmetic overflow error converting numeric to data type numeric.

    Alguém sabe o que pode ser?

    SQLServer 2008 R2

    []'s


    Fernando T. Xavier
    domingo, 29 de maio de 2011 16:25

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
    domingo, 29 de maio de 2011 17:44
    Moderador

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
    domingo, 29 de maio de 2011 17:44
    Moderador
  • 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
    segunda-feira, 30 de maio de 2011 04:33
  • Roberson, boa noite.

          Fico muito grato pela explanação, foi de grande ajuda.

    Atenciosamente,

    Alexandre Souza.

     

    terça-feira, 21 de junho de 2016 00:23