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.