Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come risolvere "La procedura prevede il parametro '@statement' di tipo 'ntext/nchar/nvarchar'." Errore in SQL Server

È 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.