Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment réparer "La procédure attend le paramètre '@statement' de type 'ntext/nchar/nvarchar'." Erreur dans SQL Server

Il est assez facile de rencontrer l'erreur Msg 214, niveau 16 lors de l'exécution de procédures stockées telles que sp_executesql ou sp_describe_first_result_set .

Heureusement, c'est aussi facile à réparer !

La raison la plus courante pour obtenir cette erreur est que vous avez oublié de préfixer votre chaîne avec N .

Par conséquent, pour résoudre ce problème, essayez de préfixer votre chaîne avec N .

Exemple de code qui provoque l'erreur

Le code suivant provoque cette erreur.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Résultat :

Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

La raison de cette erreur est que le premier argument de sp_executesql procédure doit être soit une constante Unicode, soit une variable Unicode.

Par conséquent, lorsque vous fournissez l'argument sous forme de chaîne, vous devez le préfixer avec N .

La solution

Voici la solution au problème ci-dessus.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Résultat :

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Notez que cela n'a rien à voir avec les colonnes du tableau. Par exemple, dans mes Cats table, le CatId la colonne est int et le CatsName la colonne est varchar(60) .

Variables

Si vous transmettez une variable au lieu d'une chaîne, vous pouvez modifier le type de variable. Cela vous évitera d'avoir à préfixer l'argument avec N .

Voici un exemple de variable qui provoque l'erreur.

DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;

Résultat :

Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

Une fois de plus, nous obtenons l'erreur 214, car l'argument n'est pas une constante Unicode ou une variable Unicode.

Nous pouvons résoudre ce problème en déclarant la variable en tant que variable Unicode.

DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;

Résultat :

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Un autre exemple

Les exemples ci-dessus utilisent le sp_executesql procédure, mais vous pouvez obtenir cette erreur chaque fois qu'une procédure attend Unicode mais ne l'obtient pas.

Une autre procédure système qui accepte un argument Unicode est sp_describe_first_result_set . Par conséquent, nous pouvons forcer la même erreur en utilisant cette procédure.

EXEC sp_describe_first_result_set 
    @tsql = 'SELECT * FROM Cats', 
    @params = null, 
    @browse_information_mode = 1;

Résultat :

Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1
Procedure expects parameter '@tsql' of type 'nvarchar(max)'.

Bien que le libellé exact soit légèrement différent, il s'agit de la même erreur (Msg 214, niveau 16) et du même correctif.