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 và 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.