Kesalahan SQL Server Msg 206, Level 16 adalah kesalahan umum yang didapat saat memasukkan data ke dalam tabel.
Ini terjadi saat Anda mencoba memasukkan data ke dalam kolom yang tidak kompatibel dengan tipe data yang Anda coba masukkan.
Ini bisa terjadi jika Anda secara tidak sengaja mencoba memasukkan data ke kolom yang salah (atau bahkan tabel yang salah). Tapi itu juga bisa terjadi jika Anda salah berasumsi bahwa SQL Server akan mengonversi data untuk Anda.
Untuk memperbaiki masalah ini, pastikan Anda memasukkan tipe data yang benar.
Contoh Kode Masalah
Berikut adalah contoh kode yang menghasilkan kesalahan ini.
INSERT INTO Orders(OrderId, OrderDate, OrderDesc)
VALUES ('2020-04-02', 1, 'Dog food');
Hasil:
Msg 206, Level 16, State 2, Line 1 Operand type clash: int is incompatible with date
Dalam hal ini, cukup jelas di mana saya salah, hanya dengan melihat nama kolom dan nilai yang saya coba masukkan.
Saya mencoba memasukkan nilai dalam urutan yang salah.
Masalahnya adalah saya mencoba memasukkan bilangan bulat ke dalam kolom tanggal. Secara khusus, saya mencoba memasukkan nilai 1
ke dalam kolom bernama OrderDate
.
Tentu saja, bukan nama kolom yang menyebabkan masalah. Ini adalah tipe data yang saya coba masukkan ke dalamnya.
Berikut kode yang saya gunakan untuk membuat tabel:
CREATE TABLE Orders (
OrderId int NOT NULL,
OrderDate date NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrders PRIMARY KEY CLUSTERED(OrderId, OrderDate)
);
Kita dapat melihat dengan definisi tabel bahwa OrderDate
kolom menggunakan tanggal tipe data.
Berkah dalam Penyamaran?
Meski membuat frustrasi karena mendapatkan kesalahan, terkadang itu bisa menjadi hal terbaik yang pernah terjadi pada Anda.
Jika kode tidak menghasilkan kesalahan, kami mungkin secara tidak sengaja memasukkan data yang salah ke dalam database. Ini akan mengurangi integritas data database kami.
Bayangkan OrderDate
kolom adalah waktu-tanggal bukannya tanggal :
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders (
OrderId int NOT NULL,
OrderDate datetime NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrders PRIMARY KEY CLUSTERED(OrderId, OrderDate)
);
Sekarang bayangkan kita mencoba memasukkan data berikut ke dalam tabel itu:
INSERT INTO Orders(OrderId, OrderDate, OrderDesc)
VALUES (1, 1, 'Dog food');
Hasil:
(1 row affected)
Hah? Tidak ada kesalahan?
Tepat. Tidak ada kesalahan. Ini karena waktu tanggal type kompatibel dengan int Tipe. Dengan kata lain, SQL Server mengambil int . kami nilai dan mengubahnya menjadi waktu tanggal nilai.
Beginilah tampilan tabel kita setelah operasi penyisipan itu.
SELECT * FROM Orders;
Hasil:
+-----------+-------------------------+-------------+ | OrderId | OrderDate | OrderDesc | |-----------+-------------------------+-------------| | 1 | 1900-01-02 00:00:00.000 | Dog food | +-----------+-------------------------+-------------+