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.