76 votos

¿Por qué SQL Server arroja un error de desbordamiento aritmético al convertir int a tipo de datos numérico?

Tengo un error generado por SQL Server Management Studio al ejecutar este código:

declare @percentage numeric(3,2)
set @percentage = cast(15 as numeric(3,2))

pero cuando cambio la declaración numérica a

declare @percentage numeric(4,2)
set @percentage = cast(15 as numeric(4,2))

todo funciona bien.

¿Existe una limitación para el tipo de dato numérico?

146voto

Joe Puntos 17829

Numérico define el NÚMERO TOTAL de dígitos y luego el número después del decimal.

Un numérico(3,2) solo puede contener hasta 9.99.

29voto

HLGEM Puntos 54641

Vamos a ver, numérico (3,2). Eso significa que tienes 3 lugares para datos y dos de ellos están a la derecha del decimal, dejando solo uno a la izquierda del decimal. 15 tiene dos lugares a la izquierda del decimal. Por cierto, si tal vez tienes 100 como valor, aumentaría eso a numérico (5, 2)

20voto

marc_s Puntos 321990

NUMERIC(3,2) significa: 3 dígitos en total, 2 después del punto decimal. Por lo tanto, solo tienes una sola decimal antes del punto decimal.

Intenta con NUMERIC(5,2) - tres antes, dos después del punto decimal.

18voto

Aaron Bertrand Puntos 116343

La precisión y la escala se comprenden a menudo de manera errónea. En numeric(3,2) deseas 3 dígitos en total, pero 2 a la derecha del decimal. Si deseas 15 => 15.00, por lo que el dígito inicial 1 provoca el desbordamiento (ya que si quieres 2 dígitos a la derecha del decimal, solo hay espacio a la izquierda para un dígito más). Con 4,2 no hay problema porque todos los 4 dígitos caben.

0voto

Mladen Mihajlovic Puntos 2476

Pregunta bastante antigua pero pensé que añadiría esto aquí para completar: Existe una configuración de la base de datos de SQL Server que puede afectar las consultas y arrojar este error.

SET NUMERIC_ROUNDABORT { ON | OFF }

Establecer esto en ON causará este error exacto si el resultado no encaja en el tipo de dato resultante.

Por ejemplo, establecer esto en ON y ejecutar

SELECT cast(0.0 / 1 AS NUMERIC(4,2))

arrojará este error.

Más información: https://learn.microsoft.com/en-us/sql/t-sql/statements/set-numeric-roundabort-transact-sql

También otra forma de establecerlo: página de propiedades

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X