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.