O SQL Server retorna "Erro de estouro aritmético ao converter expressão em tipo de dados int".


19

Quando executo este comando com SUM()

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

Estou entendendo,

Arithmetic overflow error converting expression to data type int.

Alguma idéia de qual é a causa disso?

Estou apenas seguindo as instruções nesta resposta .

Respostas:


24

Para valores maiores que o INTmáximo (2.147.483.647), convém 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;

Se está acontecendo no SUM, você precisa converter Amountpara 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;

1
O SQL Server não promove automaticamente do int para o bigint? #TIL Então, se você está resumindo isso, pode ser um grande exemplo, é necessário agrupar o valor CONVERT(). Lindo.
Evan Carroll

Como o seu exemplo nessa questão funcionou e o meu não funcionou? É a sua resposta?
Evan Carroll

@EvanCarroll Não tenho certeza! Suponho que seja possível que a distribuição de valor aleatório seja diferente e a minha tenha se inclinado suficientemente baixo para não se tornar um BIGINT. É sobre o meu melhor palpite.
Erik Darling

@EvanCarroll eu escrevi um dbfiddle depois de falar sobre isso com Paul W. com um exemplo mais eficiente, apenas note que não será executado em dbfiddle por causa dos requisitos de particionamento: dbfiddle.uk/...
Erik Darling

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.