É muito fácil encontrar o erro Msg 214, Level 16 ao executar procedimentos armazenados como
sp_executesql
ou sp_describe_first_result_set
. Felizmente, também é fácil de corrigir!
O motivo mais comum para obter esse erro é que você esqueceu de prefixar sua string com
N
. Portanto, para corrigir esse problema, tente prefixar sua string com
N
. Exemplo de código que causa o erro
O código a seguir causa esse erro.
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'.
A razão para este erro é que o primeiro argumento do
sp_executesql
O procedimento deve ser uma constante Unicode ou uma variável Unicode. Portanto, quando você está fornecendo o argumento como uma string, você precisa prefixá-lo com
N
. A solução
Aqui está a solução para o problema acima.
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 | +---------+-------------+
Observe que isso não tem nada a ver com as colunas da tabela. Por exemplo, no meu
Cats
tabela, o CatId
coluna é int e o CatsName
coluna é varchar(60) . Variáveis
Se você estiver passando uma variável em vez de uma string, poderá alterar o tipo de variável. Isso evitará que você tenha que prefixar o argumento com
N
. Aqui está um exemplo de uma variável que causa o erro.
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'.
Mais uma vez obtemos o erro 214, porque o argumento não é uma constante Unicode ou uma variável Unicode.
Podemos corrigir isso declarando a variável como uma variável 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 | +---------+-------------+
Mais um exemplo
Os exemplos acima usam o
sp_executesql
procedimento, mas você pode obter esse erro sempre que um procedimento espera Unicode, mas não o obtém. Outro procedimento do sistema que aceita um argumento Unicode é
sp_describe_first_result_set
. Portanto, podemos forçar o mesmo erro usando esse procedimento. 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)'.
Embora o texto exato seja um pouco diferente, é o mesmo erro (Msg 214, Level 16) e tem a mesma correção.