Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách khắc phục “Thủ tục yêu cầu tham số‘ @statement ’thuộc loại‘ ntext / nchar / nvarchar ’.” Lỗi trong máy chủ SQL

Khá dễ dàng gặp phải lỗi Msg 214, Mức 16 khi thực thi các thủ tục được lưu trữ như sp_executesql hoặc sp_describe_first_result_set .

May mắn thay, nó cũng dễ dàng sửa chữa!

Lý do phổ biến nhất dẫn đến lỗi này là bạn quên đặt tiền tố chuỗi của mình bằng N .

Do đó, để khắc phục sự cố này, hãy thử đặt tiền tố chuỗi của bạn bằng N .

Ví dụ về mã gây ra lỗi

Đoạn mã sau gây ra lỗi này.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Kết quả:

Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

Lý do cho lỗi này là đối số đầu tiên của sp_executesql thủ tục phải là một hằng số Unicode hoặc một biến Unicode.

Do đó, khi bạn đang cung cấp đối số dưới dạng một chuỗi, bạn cần đặt trước nó bằng N .

Giải pháp

Đây là giải pháp cho vấn đề trên.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Kết quả:

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Lưu ý rằng điều này không liên quan gì đến các cột trong bảng. Ví dụ:trong Cats của tôi bảng, CatId cột là int CatsName cột là varchar (60) .

Biến

Nếu bạn đang chuyển một biến thay vì một chuỗi, bạn có thể thay đổi loại biến. Làm điều này sẽ giúp bạn không phải đặt trước đối số bằng N .

Dưới đây là ví dụ về một biến gây ra lỗi.

DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;

Kết quả:

Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

Một lần nữa, chúng tôi gặp lỗi 214, vì đối số không phải là hằng số Unicode hoặc biến Unicode.

Chúng tôi có thể khắc phục điều này bằng cách khai báo biến dưới dạng biến Unicode.

DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;

Kết quả:

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Thêm một ví dụ

Các ví dụ trên sử dụng sp_executesql nhưng bạn có thể gặp lỗi này bất cứ khi nào một thủ tục đang mong đợi Unicode nhưng không nhận được.

Một thủ tục hệ thống khác chấp nhận đối số Unicode là sp_describe_first_result_set . Do đó, chúng tôi có thể xử lý cùng một lỗi bằng quy trình đó.

EXEC sp_describe_first_result_set 
    @tsql = 'SELECT * FROM Cats', 
    @params = null, 
    @browse_information_mode = 1;

Kết quả:

Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1
Procedure expects parameter '@tsql' of type 'nvarchar(max)'.

Mặc dù cách diễn đạt chính xác hơi khác một chút, nhưng đó là cùng một lỗi (Bản tin thứ 214, Cấp độ 16) và có cùng một cách sửa.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Điều gì xảy ra với một giao dịch không được cam kết khi kết nối bị đóng?

  2. Stuff và 'For Xml Path' hoạt động như thế nào trong SQL Server?

  3. Cách thay đổi cột hoặc tạo tập lệnh thay thế bằng cách sử dụng GUI trong SQL Server - Hướng dẫn sử dụng SQL Server / T-SQL Phần 38

  4. Kế hoạch thực thi SQL Server - nó là gì và nó giúp giải quyết các vấn đề về hiệu suất như thế nào?

  5. Nhận thời gian của datetime bằng T-SQL?