Při provádění uložených procedur, jako je sp_executesql
, je docela snadné narazit na chybu Msg 214, Level 16 nebo sp_describe_first_result_set
.
Naštěstí je to také snadné opravit!
Nejčastějším důvodem této chyby je, že jste zapomněli před řetězec zadat N
.
Chcete-li proto tento problém vyřešit, zkuste před řetězec zadat N
.
Příklad kódu, který způsobuje chybu
Následující kód způsobuje tuto chybu.
EXEC sp_executesql 'SELECT * FROM Cats';
Výsledek:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Důvodem této chyby je, že první argument sp_executesql
procedura musí být buď konstanta Unicode, nebo proměnná Unicode.
Proto, když poskytujete argument jako řetězec, musíte mu předponu N
.
Řešení
Zde je řešení výše uvedeného problému.
EXEC sp_executesql N'SELECT * FROM Cats';
Výsledek:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Všimněte si, že to nemá nic společného se sloupci v tabulce. Například v mém Cats
tabulka CatId
sloupec je int a CatsName
sloupec je varchar(60) .
Proměnné
Pokud předáváte proměnnou místo řetězce, můžete změnit typ proměnné. Ušetříte si tím nutnost předponovat argument N
.
Zde je příklad proměnné, která způsobuje chybu.
DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Výsledek:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Opět dostáváme chybu 214, protože argument není konstanta Unicode ani proměnná Unicode.
Můžeme to opravit tak, že proměnnou deklarujeme jako proměnnou Unicode.
DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Výsledek:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Ještě jeden příklad
Výše uvedené příklady používají sp_executesql
proceduru, ale k této chybě se můžete dostat kdykoli, když procedura očekává Unicode, ale nedostane ji.
Další systémový postup, který přijímá argument Unicode, je sp_describe_first_result_set
. Proto můžeme pomocí tohoto postupu vynutit stejnou chybu.
EXEC sp_describe_first_result_set
@tsql = 'SELECT * FROM Cats',
@params = null,
@browse_information_mode = 1;
Výsledek:
Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1 Procedure expects parameter '@tsql' of type 'nvarchar(max)'.
Přestože se přesné znění mírně liší, jedná se o stejnou chybu (Msg 214, Level 16) a má stejnou opravu.