SQL Server zwraca „Błąd przepełnienia arytmetycznego podczas konwersji wyrażenia na typ danych int.”

19

Kiedy uruchamiam to polecenie za pomocą SUM()

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

Dostaję,

Arithmetic overflow error converting expression to data type int.

Masz pojęcie, co jest tego przyczyną?

Po prostu postępuję zgodnie z instrukcjami zawartymi w tej odpowiedzi .

Evan Carroll
źródło

Odpowiedzi:

25

W przypadku wartości większych niż INTmaksimum (2 147 483 647) warto użyć 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;

Jeśli dzieje się to w SUM, musisz przekonwertować Amountna 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;
Erik Darling
źródło
2
SQL Server nie promuje automatycznie od int do bigint? # TIL Więc jeśli sumujesz, że to może być bigint, musisz zapakować wartość CONVERT(). Piękny.
Evan Carroll
Jak działał twój przykład na to pytanie, a mój nie działał wtedy? To twoja odpowiedź?
Evan Carroll
@EvanCarroll Nie jestem pewien! Przypuszczam, że możliwe jest, że losowy rozkład wartości był inny, a mój przekrzywił się wystarczająco nisko, aby nie zostać BIGINT. To chyba moje najlepsze przypuszczenie.
Erik Darling
@EvanCarroll Napisałem plik dbfiddle po rozmowie o nim z Paulem W. na bardziej efektywnym przykładzie, pamiętaj tylko, że nie będzie on działał na pliku dbfiddle z powodu wymagań dotyczących partycjonowania: dbfiddle.uk/…
Erik Darling