Dość łatwo napotkać błąd Msg 214, poziom 16 podczas wykonywania procedur składowanych, takich jak sp_executesql
lub sp_describe_first_result_set
.
Na szczęście jest to również łatwe do naprawienia!
Najczęstszym powodem pojawiania się tego błędu jest to, że zapomniałeś poprzedzić swój ciąg N
.
Dlatego, aby rozwiązać ten problem, spróbuj poprzedzić swój ciąg przedrostkiem N
.
Przykład kodu, który powoduje błąd
Poniższy kod powoduje ten błąd.
EXEC sp_executesql 'SELECT * FROM Cats';
Wynik:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Powodem tego błędu jest to, że pierwszy argument sp_executesql
procedura musi być albo stałą Unicode, albo zmienną Unicode.
Dlatego, gdy podajesz argument jako ciąg, musisz poprzedzić go N
.
Rozwiązanie
Oto rozwiązanie powyższego problemu.
EXEC sp_executesql N'SELECT * FROM Cats';
Wynik:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Zauważ, że nie ma to nic wspólnego z kolumnami w tabeli. Na przykład w moim Cats
tabeli, CatId
kolumna to int i CatsName
kolumna to varchar(60) .
Zmienne
Jeśli przekazujesz zmienną zamiast ciągu, możesz zmienić typ zmiennej. Dzięki temu nie będziesz musiał poprzedzić argumentu N
.
Oto przykład zmiennej, która powoduje błąd.
DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Wynik:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Po raz kolejny otrzymujemy błąd 214, ponieważ argument nie jest stałą Unicode ani zmienną Unicode.
Możemy to naprawić, deklarując zmienną jako zmienną Unicode.
DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Wynik:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Jeszcze jeden przykład
Powyższe przykłady używają sp_executesql
procedury, ale możesz otrzymać ten błąd za każdym razem, gdy procedura oczekuje Unicode, ale go nie otrzymuje.
Inną procedurą systemową, która akceptuje argument Unicode jest sp_describe_first_result_set
. Dlatego możemy wymusić ten sam błąd za pomocą tej procedury.
EXEC sp_describe_first_result_set
@tsql = 'SELECT * FROM Cats',
@params = null,
@browse_information_mode = 1;
Wynik:
Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1 Procedure expects parameter '@tsql' of type 'nvarchar(max)'.
Chociaż dokładne sformułowanie jest nieco inne, jest to ten sam błąd (komunikat 214, poziom 16) i ma tę samą poprawkę.