Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да коригирате „Процедурата очаква параметър „@statement“ от тип „ntext/nchar/nvarchar“.“ Грешка в SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да промените типа данни на колона в SQL база данни, без да губите данни

  2. Най-добрите форуми за производителност на SQL Server за помощ по най-трудните въпроси

  3. SQL Server 2008 - Вземете ограничения на таблицата

  4. В SQL, как можете да групирате по диапазони?

  5. Свързване на приложения, работещи на Linux, към Amazon Relational Database Services (RDS) за SQL Server