SQL Server devuelve "Error de desbordamiento aritmético al convertir la expresión al tipo de datos int".


19

Cuando ejecuto este comando con SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

Me estoy poniendo,

Arithmetic overflow error converting expression to data type int.

¿Alguna idea de cuál es la causa?

Solo estoy siguiendo las instrucciones de esta respuesta .

Respuestas:


25

Para valores mayores que el INTmáximo (2,147,483,647), querrá usar COUNT_BIG (*).

SELECT COUNT_BIG(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

Si está sucediendo en el SUM, debe convertir Amounta a BIGINT.

SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

2
¿SQL Server no promueve automáticamente de int a bigint? #TIL Entonces, si estás sumando eso podría ser bigint, debes incluir el valor CONVERT(). Hermosa.
Evan Carroll

¿Cómo funcionó su ejemplo sobre esa pregunta, y el mío no funcionó entonces? Es tu respuesta?
Evan Carroll

@EvanCarroll ¡No estoy seguro! Supongo que es posible que la distribución de valores aleatorios fuera diferente y la mía sesgada lo suficientemente baja como para no convertirse en a BIGINT. Sin embargo, esa es mi mejor suposición.
Erik Darling

@EvanCarroll Escribí un dbfiddle después de hablar de ello con Paul W. con un ejemplo más eficiente, solo tenga en cuenta que no se ejecutará en dbfiddle debido a los requisitos de partición: dbfiddle.uk/…
Erik Darling

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.