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 .

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;

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.