Nếu bạn đang gặp lỗi Msg 8115, Mức 16, lỗi tràn số học khi chuyển đổi biểu thức thành kiểu dữ liệu int trong SQL Server, có thể bạn đang thực hiện một phép tính dẫn đến giá trị nằm ngoài phạm vi.
Điều này có thể xảy ra khi bạn sử dụng một hàm như SUM()
trên một cột và kết quả tính toán dẫn đến một giá trị nằm ngoài phạm vi của loại cột.
Ví dụ về lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi:
SELECT SUM(bank_balance)
FROM accounts;
Kết quả:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Trong trường hợp này, tôi đã sử dụng SUM()
hàm lấy tổng của bank_balance
cột có kiểu dữ liệu là int
.
Lỗi xảy ra do kết quả của phép tính nằm ngoài phạm vi của int
kiểu dữ liệu.
Đây là tất cả dữ liệu trong bảng của tôi:
SELECT bank_balance
FROM accounts;
Kết quả:
+----------------+ | bank_balance | |----------------| | 1300000000 | | 1200000000 | | 800500000 | +----------------+
Đó là một số số dư ngân hàng lớn… và thêm ba số đó sẽ dẫn đến một số lớn hơn một số int
có thể xử lý (int
phạm vi là -2,147,483,648 đến 2,147,483,647).
Giải pháp
Chúng tôi có thể giải quyết lỗi này bằng cách chuyển đổi int
thành một bigint
khi chúng tôi chạy truy vấn:
SELECT SUM(CAST(bank_balance AS bigint))
FROM Accounts;
Kết quả:
3300500000
Lần này nó đã hoạt động.
Bạn cũng có thể thay đổi kiểu dữ liệu của cột thực tế để có giải pháp lâu dài hơn.
Trong trường hợp bạn đang thắc mắc, hãy bigint
phạm vi là -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807.
Cùng một lỗi trong các tình huống khác nhau
Lỗi tương tự (Msg 8115) cũng có thể xảy ra (với thông báo lỗi hơi khác) khi bạn cố gắng chuyển đổi rõ ràng giữa các kiểu dữ liệu và giá trị ban đầu nằm ngoài phạm vi của kiểu mới. Xem Khắc phục “Lỗi tràn số học khi chuyển đổi int thành kiểu dữ liệu số” trong SQL Server để khắc phục lỗi này.
Lỗi tương tự (Msg 8115) cũng có thể xảy ra (với thông báo lỗi hơi khác) khi bạn cố gắng chèn dữ liệu vào bảng khi IDENTITY
của nó cột đã đạt đến giới hạn của loại dữ liệu. Xem Khắc phục:“Lỗi tràn số học khi chuyển đổi IDENTITY
sang kiểu dữ liệu… ”trong SQL Server để biết cách khắc phục điều này.