È abbastanza facile riscontrare un messaggio di errore 214, livello 16 durante l'esecuzione di procedure memorizzate come sp_executesql
o sp_describe_first_result_set
.
Fortunatamente è anche facile da risolvere!
Il motivo più comune per ottenere questo errore è che hai dimenticato di anteporre alla stringa N
.
Pertanto, per risolvere questo problema, prova ad anteporre alla stringa N
.
Esempio di codice che causa l'errore
Il codice seguente causa questo errore.
EXEC sp_executesql 'SELECT * FROM Cats';
Risultato:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Il motivo di questo errore è che il primo argomento di sp_executesql
la procedura deve essere una costante Unicode o una variabile Unicode.
Pertanto, quando fornisci l'argomento come stringa, devi anteporre N
.
La soluzione
Ecco la soluzione al problema precedente.
EXEC sp_executesql N'SELECT * FROM Cats';
Risultato:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Nota che questo non ha nulla a che fare con le colonne nella tabella. Ad esempio, nel mio Cats
tabella, il CatId
la colonna è int e il CatsName
la colonna è varchar(60) .
Variabili
Se stai passando una variabile invece di una stringa, puoi cambiare il tipo di variabile. In questo modo eviterai di dover anteporre all'argomento N
.
Ecco un esempio di una variabile che causa l'errore.
DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Risultato:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
Ancora una volta otteniamo l'errore 214, perché l'argomento non è una costante Unicode o una variabile Unicode.
Possiamo risolvere questo problema dichiarando la variabile come variabile Unicode.
DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
Risultato:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Un altro esempio
Gli esempi precedenti utilizzano sp_executesql
procedura, ma puoi ricevere questo errore ogni volta che una procedura si aspetta Unicode ma non lo ottiene.
Un'altra procedura di sistema che accetta un argomento Unicode è sp_describe_first_result_set
. Pertanto, possiamo forzare lo stesso errore utilizzando quella procedura.
EXEC sp_describe_first_result_set
@tsql = 'SELECT * FROM Cats',
@params = null,
@browse_information_mode = 1;
Risultato:
Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1 Procedure expects parameter '@tsql' of type 'nvarchar(max)'.
Sebbene la formulazione esatta sia leggermente diversa, è lo stesso errore (Msg 214, livello 16) e ha la stessa correzione.