Máy chủ SQL trả về biểu thức chuyển đổi lỗi tràn số học của biểu thức dữ liệu thành kiểu dữ liệu int.


19

Khi tôi chạy lệnh này với SUM()

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

Tôi nhận được,

Arithmetic overflow error converting expression to data type int.

Bất kỳ ý tưởng về nguyên nhân của nó là gì?

Tôi chỉ làm theo hướng dẫn trong câu trả lời này .

Câu trả lời:


24

Đối với các giá trị lớn hơn mức INTtối đa (2.147.483.647), bạn sẽ muốn sử dụng 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;

Nếu nó xảy ra trong SUM, bạn cần chuyển đổi Amountsang 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;

1
SQL Server không tự động quảng bá từ int đến bigint? #TIL Vì vậy, nếu bạn đang tổng kết có thể là vấn đề lớn, bạn cần phải bọc giá trị CONVERT(). Xinh đẹp.
Evan Carroll

Làm thế nào mà ví dụ của bạn về câu hỏi đó hoạt động, và sau đó tôi không làm việc? Đó là câu trả lời của bạn?
Evan Carroll

@EvanCarroll Tôi không chắc! Tôi cho rằng có thể phân phối giá trị ngẫu nhiên là khác nhau và tôi bị lệch đủ thấp để không trở thành a BIGINT. Đó là về dự đoán tốt nhất của tôi mặc dù.
Erik Darling

@EvanCarroll Tôi đã viết một dbfiddle sau khi nói về nó với Paul W. với một ví dụ hiệu quả hơn, chỉ cần lưu ý rằng nó sẽ không chạy trên dbfiddle vì các yêu cầu phân vùng: dbfiddle.uk/iêu
Erik Darling

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.