Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Perbaiki Msg 8117 "Operand tipe data varchar tidak valid untuk operator penjumlahan" di SQL Server

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.25

Ini 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 menggunakan ISNUMERIC() untuk mengetahui lebih lanjut tentang ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menangkap dan Menganalisis Acara SQL Server

  2. Cara Membuat Database di SQL Server

  3. Memantau Database dan Instance melalui Activity Monitor | Pemecahan Masalah Kinerja SQL Server -2

  4. Bagaimana menghubungkan ke database dari Unity

  5. SQL Server UNION - Apa ORDER BY Behavior default?