Доста лесно е да срещнете грешка 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) и има същата корекция.