SQL Server mengembalikan "Arithmetic overflow error mengubah ekspresi ke int tipe data."

19

Ketika saya menjalankan perintah ini dengan SUM()

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

Saya mendapatkan,

Arithmetic overflow error converting expression to data type int.

Adakah yang tahu apa penyebabnya?

Saya hanya mengikuti instruksi dalam jawaban ini .

Evan Carroll
sumber

Jawaban:

25

Untuk nilai yang lebih besar dari INTmaks (2.147.483.647), Anda ingin menggunakan 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;

Jika itu terjadi di SUM, Anda harus mengonversi Amountke 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;
Erik Darling
sumber
2
SQL Server tidak secara otomatis mempromosikan dari int ke bigint? #TIL Jadi jika Anda menjumlahkan itu bisa menjadi hal besar, Anda harus memasukkan nilainya CONVERT(). Cantik.
Evan Carroll
Bagaimana contoh Anda pada pertanyaan itu berhasil, dan pertanyaan saya tidak berhasil saat itu? Itu jawaban kamu?
Evan Carroll
@ EvanCarroll Saya tidak yakin! Saya kira itu mungkin bahwa distribusi nilai acak berbeda dan saya cenderung cukup rendah untuk tidak menjadi BIGINT. Itu tentang tebakan terbaik saya.
Erik Darling
@EvanCarroll Saya menulis dbfiddle setelah membicarakannya dengan Paul W. dengan contoh yang lebih efisien, hanya perlu dicatat bahwa itu tidak akan berjalan pada dbfiddle karena persyaratan partisi: dbfiddle.uk/…
Erik Darling