sql >> Databasteknik >  >> RDS >> Sqlserver

Så här fixar du "Procedur förväntar sig parametern '@statement' av typen 'ntext/nchar/nvarchar'." Fel i SQL Server

Det är ganska lätt att stöta på felmeddelande 214, nivå 16 när man kör lagrade procedurer som sp_executesql eller sp_describe_first_result_set .

Lyckligtvis är det lätt att fixa också!

Den vanligaste orsaken till att du får det här felet är att du glömt att prefixa din sträng med N .

För att åtgärda det här problemet, försök därför att prefixa din sträng med N .

Exempel på kod som orsakar felet

Följande kod orsakar detta fel.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Resultat:

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

Anledningen till detta fel är att det första argumentet för sp_executesql proceduren måste vara antingen en Unicode-konstant eller en Unicode-variabel.

Därför, när du tillhandahåller argumentet som en sträng, måste du prefixet det med N .

Lösningen

Här är lösningen på problemet ovan.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Resultat:

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

Observera att detta inte har något att göra med kolumnerna i tabellen. Till exempel i min Cats tabellen, CatId kolumnen är int och CatsName kolumnen är varchar(60) .

Variabler

Om du skickar en variabel istället för en sträng kan du ändra variabeltypen. Genom att göra detta slipper du att behöva prefixa argumentet med N .

Här är ett exempel på en variabel som orsakar felet.

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

Resultat:

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

Återigen får vi 214-felet, eftersom argumentet inte är en Unicode-konstant eller en Unicode-variabel.

Vi kan fixa detta genom att deklarera variabeln som en Unicode-variabel.

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

Resultat:

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

Ett exempel till

Exemplen ovan använder sp_executesql procedur, men du kan få det här felet när en procedur förväntar sig Unicode men inte får det.

En annan systemprocedur som accepterar ett Unicode-argument är sp_describe_first_result_set . Därför kan vi tvinga fram samma fel med den proceduren.

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

Resultat:

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

Även om den exakta formuleringen är något annorlunda, är det samma fel (Msg 214, Level 16) och har samma fix.


  1. RAND() Exempel i SQL Server

  2. importera redan skapad SQLite-databas (xamarin)

  3. Hur WEEKOFYEAR() fungerar i MariaDB

  4. Vad är nytt i MariaDB 10.6