SQL Server gibt "Arithmetischer Überlauffehler beim Konvertieren des Ausdrucks in den Datentyp int" zurück.


19

Wenn ich diesen Befehl mit SUM()

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

Ich erhalte,

Arithmetic overflow error converting expression to data type int.

Irgendeine Idee woran es liegt?

Ich folge nur den Anweisungen in dieser Antwort .

Antworten:


24

Für Werte größer als das Maximum ( INT2.147.483.647) möchten Sie COUNT_BIG (*) verwenden.

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

Wenn es in der geschieht SUM, müssen Sie konvertieren Amountzu ein 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
SQL Server befördert nicht automatisch von int nach bigint? #TIL Wenn Sie also summieren, dass es sich um eine Bigint-Summe handeln könnte , müssen Sie den Wert einschließen CONVERT(). Schön.
Evan Carroll

Wie hat Ihr Beispiel bei dieser Frage funktioniert und meins hat damals nicht funktioniert? Es ist deine Antwort?
Evan Carroll

@EvanCarroll Ich bin nicht sicher! Ich nehme an, es ist möglich, dass die zufällige Werteverteilung anders war und meine niedrig genug, um keine zu werden BIGINT. Das ist ungefähr meine beste Vermutung.
Erik Darling

@EvanCarroll Ich habe eine DBFiddle geschrieben, nachdem ich mit Paul W. über sie mit einem effizienteren Beispiel gesprochen habe. Beachten Sie jedoch, dass sie aufgrund der Partitionierungsanforderungen nicht auf DBFiddle ausgeführt werden kann: dbfiddle.uk/…
Erik Darling

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.