sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir "El procedimiento espera el parámetro '@statement' de tipo 'ntext/nchar/nvarchar'". Error en el servidor SQL

Es muy fácil encontrar el mensaje de error 214, nivel 16 al ejecutar procedimientos almacenados como sp_executesql o sp_describe_first_result_set .

¡Afortunadamente, también es fácil de arreglar!

La razón más común para obtener este error es que olvidó prefijar su cadena con N .

Por lo tanto, para solucionar este problema, intente prefijar su cadena con N .

Ejemplo de código que causa el error

El siguiente código provoca este error.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Resultado:

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

El motivo de este error es que el primer argumento de sp_executesql El procedimiento debe ser una constante Unicode o una variable Unicode.

Por lo tanto, cuando proporcione el argumento como una cadena, debe anteponerle N .

La solución

Aquí está la solución al problema anterior.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Resultado:

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

Tenga en cuenta que esto no tiene nada que ver con las columnas de la tabla. Por ejemplo, en mi Cats tabla, el CatId la columna es int y el CatsName la columna es varchar(60) .

Variables

Si está pasando una variable en lugar de una cadena, puede cambiar el tipo de variable. Hacer esto le evitará tener que prefijar el argumento con N .

Aquí hay un ejemplo de una variable que causa el error.

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

Resultado:

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

Una vez más obtenemos el error 214, porque el argumento no es una constante Unicode o una variable Unicode.

Podemos arreglar esto declarando la variable como una variable Unicode.

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

Resultado:

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

Un ejemplo más

Los ejemplos anteriores usan el sp_executesql procedimiento, pero puede obtener este error cada vez que un procedimiento espera Unicode pero no lo obtiene.

Otro procedimiento del sistema que acepta un argumento Unicode es sp_describe_first_result_set . Por lo tanto, podemos forzar el mismo error usando ese procedimiento.

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

Resultado:

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

Aunque la redacción exacta es ligeramente diferente, es el mismo error (Msg 214, Nivel 16) y tiene la misma corrección.