Nếu bạn gặp lỗi SQL Server Msg 8117 với thông báo Kiểu dữ liệu toán hạng varchar không hợp lệ cho toán tử sum , đó là do bạn đang chuyển sai loại dữ liệu cho một toán tử hoặc hàm.
Trong trường hợp này, lỗi chỉ ra rằng chúng tôi đang chuyển một chuỗi tới SUM()
hàm số. T he SUM()
hàm không hoạt động trên chuỗi. Nó chỉ hoạt động trên các kiểu số.
Lỗi tương tự (Msg 8117) cũng có thể xảy ra trong các ngữ cảnh khác - nó không giới hạn ở SUM()
chức năng.
Ví dụ về lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi:
SELECT SUM(ProductName)
FROM Products;
Kết quả:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
Trong trường hợp này, chúng tôi đang cố gắng thêm ProductName
cột.
Trong trường hợp này, rất có thể ProductName
cột là một varchar
cột. Chúng tôi có thể đã chọn sai cột.
Giải pháp 1
Để khắc phục lỗi này, trước tiên chúng ta nên kiểm tra xem chúng ta đã chọn đúng cột chưa. Nếu chúng tôi không có cột chính xác, hãy thay đổi nó thành cột đúng:
SELECT SUM(Price)
FROM Products;
Hy vọng rằng giải quyết được vấn đề. Nói cách khác, hy vọng rằng Price
cột là số, giống như nó phải là.
Nhưng nếu không thì sao?
Giải pháp 2
Trong một số trường hợp, bạn có thể thấy rằng bạn đã chọn đúng cột, nhưng cột đó sử dụng loại dữ liệu không phù hợp. Ví dụ:giả sử Price
của chúng tôi cột thực sự được xác định là một varchar
cột.
Trong trường hợp đó, chúng tôi sẽ gặp lỗi tương tự:
SELECT SUM(Price)
FROM Products;
Kết quả:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
Ngay từ cái nhìn đầu tiên, có vẻ như không có gì sai với tuyên bố này. Tất cả những gì chúng tôi đang làm là nhận được tổng các giá trị trong Price
cột. Đây là một ví dụ hoàn hảo về những gì SUM()
chức năng được thiết kế để làm.
Tất nhiên, giả định ở đây là Price
cột là số. Nhưng theo thông báo lỗi, nó không phải là số - nó là một varchar
.
Hãy kiểm tra loại dữ liệu của cột:
SELECT
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH AS MAX_LENGTH,
CHARACTER_OCTET_LENGTH AS OCTET_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Products'
AND COLUMN_NAME = 'Price';
Kết quả:
+-------------+--------------+----------------+ | DATA_TYPE | MAX_LENGTH | OCTET_LENGTH | |-------------+--------------+----------------| | varchar | 255 | 255 | +-------------+--------------+----------------+
Như nghi ngờ, cột thuộc loại varchar
.
Trong trường hợp này, chúng tôi có hai lựa chọn; thay đổi loại của cột hoặc chuyển đổi loại của nó nhanh chóng khi nhận được tổng của nó.
Hãy nhanh chóng chuyển đổi loại của nó:
SELECT SUM(CAST(Price AS decimal(8,2)))
FROM Products;
Kết quả:
48.25
May mắn thay, điều này đã hiệu quả.
Trong trường hợp này, tất cả dữ liệu trong Price
cột có thể được chuyển đổi thành kiểu số.
Nếu bạn gặp lỗi Msg 8114 có nội dung như Lỗi khi chuyển đổi kiểu dữ liệu varchar thành số , thì điều đó có nghĩa là cột chứa dữ liệu không thể chuyển đổi thành số.
Lỗi trông như sau:
Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar to numeric.
Trong trường hợp này, bạn sẽ cần tìm dữ liệu không phải dạng số và quyết định phải làm gì với nó.
Dưới đây là cách chúng tôi có thể tìm các giá trị không phải số:
SELECT Price
FROM Products
WHERE ISNUMERIC(Price) <> 1;
Kết quả:
+-------------+ | Price | |-------------| | Ten dollars | | Fifteen | +-------------+
Chúng tôi đã tìm ra thủ phạm!
Trừ khi có lý do chính đáng để không làm như vậy, chúng ta nên thay đổi các giá trị đó thành các giá trị tương đương số.
Sau đó, chúng tôi nên xem xét việc thay đổi loại dữ liệu của cột để loại dữ liệu này không thể được chèn trong tương lai. Làm điều này sẽ giúp thực thi tính toàn vẹn của dữ liệu.
Một điều cần lưu ý khi sử dụng ISNUMERIC()
chức năng là nó đôi khi có thể trả về kết quả dương tính giả. Ý tôi là có một số ký tự không phải số được hiểu là số. Xem các ký tự không phải số trả về số dương khi sử dụng ISNUMERIC()
để biết thêm về điều này.