Sangat mudah untuk menemukan kesalahan Msg 214, Level 16 saat menjalankan prosedur tersimpan seperti sp_executesql
atau sp_describe_first_result_set
.
Untungnya mudah diperbaiki juga!
Alasan paling umum untuk mendapatkan kesalahan ini adalah Anda lupa memberi awalan string Anda dengan N
.
Oleh karena itu, untuk memperbaiki masalah ini, coba awali string Anda dengan N
.
Contoh Kode yang Menyebabkan Kesalahan
Kode berikut menyebabkan kesalahan ini.
EXEC sp_executesql 'SELECT * FROM Cats';
Hasil:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Alasan kesalahan ini adalah bahwa argumen pertama dari sp_executesql
prosedur harus berupa konstanta Unicode atau variabel Unicode.
Oleh karena itu, saat Anda memberikan argumen sebagai string, Anda harus mengawalinya dengan N
.
Solusinya
Inilah solusi untuk masalah di atas.
EXEC sp_executesql N'SELECT * FROM Cats';
Hasil:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Perhatikan bahwa ini tidak ada hubungannya dengan kolom dalam tabel. Misalnya, di Cats
. saya tabel, CatId
kolomnya adalah int dan CatsName
kolomnya adalah varchar(60) .
Variabel
Jika Anda melewatkan variabel alih-alih string, Anda bisa mengubah tipe variabel. Melakukan ini akan menyelamatkan Anda dari keharusan mengawali argumen dengan N
.
Berikut ini contoh variabel yang menyebabkan kesalahan.
DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Hasil:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Sekali lagi kita mendapatkan kesalahan 214, karena argumennya bukan konstanta Unicode atau variabel Unicode.
Kita dapat memperbaikinya dengan mendeklarasikan variabel sebagai variabel Unicode.
DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Hasil:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Satu Contoh Lagi
Contoh di atas menggunakan sp_executesql
prosedur, tetapi Anda bisa mendapatkan kesalahan ini setiap kali prosedur mengharapkan Unicode tetapi tidak mendapatkannya.
Prosedur sistem lain yang menerima argumen Unicode adalah sp_describe_first_result_set
. Oleh karena itu, kami dapat memaksakan kesalahan yang sama menggunakan prosedur itu.
EXEC sp_describe_first_result_set
@tsql = 'SELECT * FROM Cats',
@params = null,
@browse_information_mode = 1;
Hasil:
Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1 Procedure expects parameter '@tsql' of type 'nvarchar(max)'.
Meskipun kata yang tepat sedikit berbeda, ini adalah kesalahan yang sama (Msg 214, Level 16), dan memiliki perbaikan yang sama.