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.