Jika Anda mendapatkan kesalahan SQL Server Msg 8116 dengan teks yang berbunyi Tanggal tipe data argumen tidak valid untuk argumen 1 fungsi substring , itu karena Anda meneruskan tipe data yang salah ke suatu fungsi – dalam hal ini, SUBSTRING()
fungsi.
Anda juga dapat melihat kesalahan yang sama (Msg 8116) di banyak konteks lain – ini tidak terbatas pada SUBSTRING()
fungsi.
Contoh Kesalahan
Berikut contoh kode yang menghasilkan kesalahan:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Hasil:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Di sini, saya melewati date
ketik sebagai argumen pertama untuk SUBSTRING()
, tapi ini tidak diperbolehkan.
SUBSTRING()
fungsi menerima karakter, biner, teks, ntext, atau ekspresi gambar sebagai argumen pertama. Jika Anda memberikan argumen yang bukan salah satu dari jenis yang diterima, maka kesalahan di atas akan terjadi.
Seperti yang disebutkan, itu bisa terjadi dengan fungsi lain juga. Apa pun itu, itu berarti Anda meneruskan tipe data yang salah ke fungsi tersebut.
Solusi 1
Pertama, jika Anda melewati kolom, periksa apakah Anda memiliki kolom yang benar. Solusinya dapat berupa masalah sederhana dengan mengganti nama kolom yang salah dengan nama kolom yang benar.
Sama jika Anda melewatkan variabel – periksa apakah itu variabel yang benar. Anda mungkin dapat mengatasi masalah ini dengan mengganti variabel yang salah dengan variabel yang benar.
Solusi 2
Jika Anda yakin telah mendapatkan nama/variabel kolom yang benar, salah satu cara untuk memperbaiki kesalahan ini adalah dengan mengonversi argumen ke tipe data yang sesuai.
Misalnya, kita dapat menyesuaikan contoh di atas menjadi berikut:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Hasil:
2020
Solusi 3
Namun sebelum kita mengonversi apa pun, terkadang ada baiknya kita mundur sejenak dan berpikir apakah ada cara yang lebih sederhana untuk menghasilkan hasil yang diinginkan.
Misalnya, dalam contoh di atas, yang kami coba lakukan hanyalah mengekstrak tahun dari tanggal. Dalam hal ini, lebih baik kita menghilangkan SUBSTRING()
berfungsi sama sekali, mendukung YEAR()
fungsi:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Hasil:
2020
Cara lain untuk melakukannya adalah dengan menggunakan FORMAT()
fungsi:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Hasil:
2020