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.