sql >> Database >  >> RDS >> Sqlserver

Hoe te repareren "Procedure verwacht parameter '@statement' van het type 'ntext/nchar/nvarchar'." Fout in SQL Server

Het is vrij eenvoudig om foutbericht 214, niveau 16 tegen te komen bij het uitvoeren van opgeslagen procedures zoals sp_executesql of sp_describe_first_result_set .

Gelukkig is het ook gemakkelijk op te lossen!

De meest voorkomende reden voor het krijgen van deze fout is dat u bent vergeten uw string te laten voorafgaan door N .

Probeer daarom, om dit probleem op te lossen, uw tekenreeks vooraf te gaan met N .

Voorbeeld van code die de fout veroorzaakt

De volgende code veroorzaakt deze fout.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Resultaat:

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

De reden voor deze fout is dat het eerste argument van de sp_executesql procedure moet een Unicode-constante of een Unicode-variabele zijn.

Daarom, wanneer u het argument als een tekenreeks opgeeft, moet u het voorafgaan met N .

De oplossing

Hier is de oplossing voor het bovenstaande probleem.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Resultaat:

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

Merk op dat dit niets te maken heeft met de kolommen in de tabel. Bijvoorbeeld in mijn Cats tabel, de CatId kolom is int en de CatsName kolom is varchar(60) .

Variabelen

Als u een variabele doorgeeft in plaats van een tekenreeks, kunt u het type variabele wijzigen. Als u dit doet, hoeft u het argument niet vooraf te laten gaan door N .

Hier is een voorbeeld van een variabele die de fout veroorzaakt.

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

Resultaat:

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

Opnieuw krijgen we de 214-fout, omdat het argument geen Unicode-constante of Unicode-variabele is.

We kunnen dit oplossen door de variabele als een Unicode-variabele te declareren.

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

Resultaat:

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

Nog een voorbeeld

De bovenstaande voorbeelden gebruiken de sp_executesql procedure, maar u kunt deze foutmelding krijgen wanneer een procedure Unicode verwacht maar deze niet krijgt.

Een andere systeemprocedure die een Unicode-argument accepteert, is sp_describe_first_result_set . Daarom kunnen we dezelfde fout forceren met die procedure.

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

Resultaat:

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

Hoewel de exacte bewoording iets anders is, is het dezelfde fout (bericht 214, niveau 16) en heeft het dezelfde oplossing.


  1. NHibernate-toewijzing voor Oracle INTERVAL DAY TO SECOND-gegevenstype

  2. Oracle - Kloontabel - Structuur, gegevensbeperkingen en alles

  3. toegang geweigerd voor gebruiker @ 'localhost' tot database ''

  4. Hoe kan ik een PostgreSQL-trigger gebruiken om wijzigingen op te slaan (SQL-statements en rijwijzigingen)