Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como corrigir "O procedimento espera o parâmetro '@statement' do tipo 'ntext/nchar/nvarchar'." Erro no SQL Server


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