Jika Anda mendapatkan kesalahan SQL Server Msg 8117 dengan pesan Operand tipe data varchar is invalid for sum operator , itu karena Anda meneruskan tipe data yang salah ke operator atau fungsi.
Dalam hal ini, kesalahan menunjukkan bahwa kami meneruskan string ke SUM()
fungsi. Tdia SUM()
fungsi tidak beroperasi pada string. Ini hanya berfungsi pada tipe numerik.
Kesalahan yang sama (Msg 8117) juga dapat terjadi dalam konteks lain – tidak terbatas pada SUM()
fungsi.
Contoh Kesalahan
Berikut contoh kode yang menghasilkan kesalahan:
SELECT SUM(ProductName)
FROM Products;
Hasil:
Msg 8117, Level 16, State 1, Line 1Operand tipe data varchar tidak valid untuk operator penjumlahan.
Dalam hal ini, kami mencoba menambahkan ProductName
kolom.
Dalam hal ini, kemungkinan besar ProductName
kolom adalah varchar
kolom. Kami mungkin salah kolom.
Solusi 1
Untuk memperbaiki kesalahan ini, pertama-tama kita harus memeriksa apakah kita memiliki kolom yang benar. Jika kami tidak memiliki kolom yang benar, ubah ke kolom yang benar:
SELECT SUM(Price)
FROM Products;
Semoga itu menyelesaikan masalah. Dengan kata lain, semoga Price
kolom adalah numerik, seperti seharusnya.
Tapi bagaimana jika tidak?
Solusi 2
Dalam beberapa kasus, Anda mungkin menemukan bahwa Anda memiliki kolom yang benar, tetapi kolom tersebut menggunakan tipe data yang tidak sesuai. Misalnya, misalkan Price
kolom sebenarnya didefinisikan sebagai varchar
kolom.
Dalam hal ini, kami akan mendapatkan kesalahan yang sama:
SELECT SUM(Price)
FROM Products;
Hasil:
Msg 8117, Level 16, State 1, Line 1Operand tipe data varchar tidak valid untuk operator penjumlahan.
Sekilas, tidak ada yang salah dengan pernyataan ini. Yang kami lakukan hanyalah mendapatkan total nilai dalam Price
kolom. Ini adalah contoh sempurna dari apa yang SUM()
fungsi yang dirancang untuk dilakukan.
Tentu saja, asumsi di sini adalah Price
kolom adalah numerik. Tetapi menurut pesan kesalahan, itu bukan numerik – ini adalah varchar
.
Mari kita periksa tipe data kolom:
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';
Hasil:
+-------------+--------------+----------------+ | DATA_TYPE | MAX_LENGTH | OCTET_LENGTH ||-------------+--------------+----------------|| varchar | 255 | 255 |+-------------+--------------+----------------+Seperti yang diduga, kolom tersebut bertipe
varchar
.Dalam hal ini, kami memiliki dua opsi; ubah jenis kolom, atau ubah jenisnya dengan cepat saat mendapatkan jumlah.
Mari kita ubah tipenya dengan cepat:
SELECT SUM(CAST(Price AS decimal(8,2))) FROM Products;
Hasil:
48.25Ini berhasil, untungnya.
Dalam hal ini, semua data dalam
Price
kolom dapat dikonversi ke tipe numerik.Jika Anda mendapatkan pesan kesalahan 8114 yang berbunyi seperti Kesalahan saat mengubah tipe data varchar menjadi numerik , maka itu berarti kolom tersebut berisi data yang tidak dapat diubah menjadi numerik.
Kesalahannya terlihat seperti ini:
Msg 8114, Level 16, State 5, Line 1Error mengonversi tipe data varchar ke numerik.Dalam hal ini, Anda harus menemukan data non-numerik dan memutuskan apa yang harus dilakukan dengannya.
Inilah cara kami menemukan nilai non-numerik:
SELECT Price FROM Products WHERE ISNUMERIC(Price) <> 1;
Hasil:
+-------------+| Harga ||-------------|| Sepuluh dolar || Lima belas |+-------------+Kami telah menemukan pelakunya!
Kecuali ada alasan bagus untuk tidak melakukannya, kita harus mengubah nilai-nilai tersebut menjadi ekuivalen numeriknya.
Setelah itu, kita harus mempertimbangkan untuk mengubah tipe data kolom, sehingga tipe data ini tidak dapat disisipkan di masa mendatang. Melakukan ini akan membantu menegakkan integritas data.
Satu hal yang harus diperhatikan saat menggunakan
ISNUMERIC()
fungsinya adalah kadang-kadang dapat mengembalikan hasil positif palsu. Yang saya maksud adalah bahwa ada beberapa karakter non-numerik yang ditafsirkan sebagai numerik. Lihat Karakter Non-Angka yang Mengembalikan Positif saat menggunakanISNUMERIC()
untuk mengetahui lebih lanjut tentang ini.