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

Cara Memperbaiki "Prosedur mengharapkan parameter '@ pernyataan' dari jenis 'ntext/nchar/nvarchar'." Kesalahan dalam SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa melakukan pernyataan UPDATE dengan JOIN di SQL Server?

  2. Berbagai Cara untuk Membandingkan Skema dan Data Tabel SQL Server

  3. IDENTITY() vs IDENTITY() di SQL Server:Apa Bedanya?

  4. alternatif untuk REPLACE pada tipe data teks atau nteks

  5. Pivot beberapa kolom berdasarkan satu kolom di SQL Server