sql >> Databáze >  >> RDS >> Sqlserver

Jak opravit „Procedura očekává parametr ‚@statement‘ typu ‚ntext/nchar/nvarchar‘.“ Chyba na serveru SQL Server

Při provádění uložených procedur, jako je sp_executesql, je docela snadné narazit na chybu Msg 214, Level 16 nebo sp_describe_first_result_set .

Naštěstí je to také snadné opravit!

Nejčastějším důvodem této chyby je, že jste zapomněli před řetězec zadat N .

Chcete-li proto tento problém vyřešit, zkuste před řetězec zadat N .

Příklad kódu, který způsobuje chybu

Následující kód způsobuje tuto chybu.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Výsledek:

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

Důvodem této chyby je, že první argument sp_executesql procedura musí být buď konstanta Unicode, nebo proměnná Unicode.

Proto, když poskytujete argument jako řetězec, musíte mu předponu N .

Řešení

Zde je řešení výše uvedeného problému.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Výsledek:

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

Všimněte si, že to nemá nic společného se sloupci v tabulce. Například v mém Cats tabulka CatId sloupec je int a CatsName sloupec je varchar(60) .

Proměnné

Pokud předáváte proměnnou místo řetězce, můžete změnit typ proměnné. Ušetříte si tím nutnost předponovat argument N .

Zde je příklad proměnné, která způsobuje chybu.

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

Výsledek:

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

Opět dostáváme chybu 214, protože argument není konstanta Unicode ani proměnná Unicode.

Můžeme to opravit tak, že proměnnou deklarujeme jako proměnnou Unicode.

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

Výsledek:

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

Ještě jeden příklad

Výše uvedené příklady používají sp_executesql proceduru, ale k této chybě se můžete dostat kdykoli, když procedura očekává Unicode, ale nedostane ji.

Další systémový postup, který přijímá argument Unicode, je sp_describe_first_result_set . Proto můžeme pomocí tohoto postupu vynutit stejnou chybu.

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

Výsledek:

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

Přestože se přesné znění mírně liší, jedná se o stejnou chybu (Msg 214, Level 16) a má stejnou opravu.


  1. Přehled nového DBaaS od MariaDB - SkySQL

  2. Připojení 64bitové aplikace ke Clarion TopSpeed

  3. Práce s Java Data v Sisense

  4. Adaptér Postgresql (pg):nelze se připojit k serveru