Доста лесно е да срещнете грешка Msg 214, ниво 16 при изпълнение на съхранени процедури като sp_executesql
или sp_describe_first_result_set
.
За щастие и това е лесно да се поправи!
Най-честата причина за получаване на тази грешка е, че сте забравили да поставите префикс на низа си с N
.
Ето защо, за да отстраните този проблем, опитайте да поставите префикс на низа си с N
.
Пример за код, който причинява грешката
Следният код причинява тази грешка.
EXEC sp_executesql 'SELECT * FROM Cats';
Резултат:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Причината за тази грешка е, че първият аргумент на sp_executesql
процедурата трябва да бъде или Unicode константа, или Unicode променлива.
Следователно, когато предоставяте аргумента като низ, трябва да го поставите префикс с N
.
Решението
Ето решението на горния проблем.
EXEC sp_executesql N'SELECT * FROM Cats';
Резултат:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Имайте предвид, че това няма нищо общо с колоните в таблицата. Например в моя Cats
таблица, CatId
колоната е int и CatsName
колоната е varchar(60) .
Променливи
Ако предавате променлива вместо низ, можете да промените типа на променливата. Правейки това ще ви спести от необходимостта да поставяте префикс на аргумента с N
.
Ето пример за променлива, която причинява грешката.
DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Резултат:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Отново получаваме грешка 214, защото аргументът не е Unicode константа или Unicode променлива.
Можем да поправим това, като декларираме променливата като Unicode променлива.
DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Резултат:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Още един пример
Горните примери използват sp_executesql
процедура, но можете да получите тази грешка всеки път, когато процедурата очаква Unicode, но не я получава.
Друга системна процедура, която приема Unicode аргумент е sp_describe_first_result_set
. Следователно можем да принудим същата грешка, използвайки тази процедура.
EXEC sp_describe_first_result_set
@tsql = 'SELECT * FROM Cats',
@params = null,
@browse_information_mode = 1;
Резултат:
Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1 Procedure expects parameter '@tsql' of type 'nvarchar(max)'.
Въпреки че точната формулировка е малко по-различна, това е същата грешка (Съобщение 214, ниво 16) и има същата корекция.