sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan rettes "Procedure forventer parameter '@statement' af typen 'ntext/nchar/nvarchar'." Fejl i SQL Server

Det er ret nemt at støde på fejlmeddelelse 214, niveau 16, når man udfører lagrede procedurer såsom sp_executesql eller sp_describe_first_result_set .

Heldigvis er det også nemt at rette!

Den mest almindelige årsag til at få denne fejl er, at du har glemt at præfikse din streng med N .

For at løse dette problem, prøv derfor at sætte N foran din streng .

Eksempel på kode, der forårsager fejlen

Følgende kode forårsager denne fejl.

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'.

Årsagen til denne fejl er, at det første argument i sp_executesql procedure skal enten være en Unicode-konstant eller en Unicode-variabel.

Derfor, når du angiver argumentet som en streng, skal du præfikse det med N .

Løsningen

Her er løsningen på ovenstående problem.

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        |
+---------+-------------+

Bemærk, at dette ikke har noget at gøre med kolonnerne i tabellen. For eksempel i min Cats tabellen, CatId kolonne er int og CatsName kolonnen er varchar(60) .

Variabler

Hvis du sender en variabel i stedet for en streng, kan du ændre variabeltypen. Hvis du gør dette, slipper du for at skulle præfikse argumentet med N .

Her er et eksempel på en variabel, der forårsager fejlen.

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'.

Endnu en gang får vi fejlen 214, fordi argumentet ikke er en Unicode-konstant eller en Unicode-variabel.

Vi kan rette dette ved at erklære variablen 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        |
+---------+-------------+

Et eksempel mere

Ovenstående eksempler bruger sp_executesql procedure, men du kan få denne fejl, hver gang en procedure forventer Unicode, men ikke får den.

En anden systemprocedure, der accepterer et Unicode-argument, er sp_describe_first_result_set . Derfor kan vi fremtvinge den samme fejl ved at bruge den procedure.

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)'.

Selvom den nøjagtige ordlyd er lidt anderledes, er det den samme fejl (Msg 214, Level 16) og har den samme rettelse.


  1. Find rækker, der ikke indeholder numeriske data i Oracle

  2. Viser billede i Ireports ved hjælp af PostgreSql

  3. MySQL Trigger kun efter opdatering, hvis rækken er ændret

  4. Postgres holdt lige tilfældigt op med at virke (Rails, PGSQL.5432)