SQL Server ส่งคืน“ ข้อผิดพลาดทางคณิตศาสตร์มากเกินไปในการแปลงนิพจน์เป็นชนิดข้อมูล int”


19

เมื่อฉันเรียกใช้คำสั่งนี้ด้วย SUM()

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

ฉันได้รับ,

Arithmetic overflow error converting expression to data type int.

ความคิดเกี่ยวกับสาเหตุของมันคืออะไร?

ฉันแค่ทำตามคำแนะนำในคำตอบนี้

คำตอบ:


25

สำหรับค่าที่มากกว่าINTค่าสูงสุด (2,147,483,647) คุณจะต้องใช้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;

ถ้ามันเกิดขึ้นในSUMคุณจำเป็นต้องแปลงไปAmountBIGINT

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 ไม่เลื่อนขั้นจาก int ไปเป็น bigint โดยอัตโนมัติ? #TIL ดังนั้นหากคุณสรุปว่าอาจเป็นเรื่องใหญ่คุณจะต้องห่อค่าCONVERT()ไว้ สวย.
Evan Carroll

ตัวอย่างของคุณเกี่ยวกับคำถามนั้นทำงานอย่างไรและของฉันก็ไม่ทำงาน มันเป็นคำตอบของคุณ?
Evan Carroll

@EvanCarroll ฉันไม่แน่ใจ! BIGINTฉันคิดว่ามันเป็นไปได้ว่าการกระจายสุ่มค่าที่แตกต่างกันและเหมืองเบ้พอต่ำเพื่อไม่ให้กลายเป็น นั่นคือการคาดเดาที่ดีที่สุดของฉัน
Erik Darling

@EvanCarroll ผมเขียน dbfiddle หลังจากที่พูดคุยเกี่ยวกับเรื่องนี้กับพอลดับบลิวด้วยตัวอย่างมีประสิทธิภาพมากขึ้นเพียงแค่ทราบว่ามันจะไม่ทำงานบน dbfiddle เพราะต้องการแบ่ง: dbfiddle.uk/...
เอริคดาร์ลิ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.