Por que recebo “O procedimento espera o parâmetro '@statement' do tipo 'ntext / nchar / nvarchar'.” quando tento usar sp_executesql?

96

Por que recebo este erro

Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

quando tento usar sp_executesql?

Manoj Wadhwani
fonte
1
Como você está tentando executá-lo? Em T-SQL? De um programa? Você está passando o parâmetro "@statement" obrigatório?
Matt Hamilton

Respostas:

216

Parece que você está chamando sp_executesql com uma instrução VARCHAR, quando precisa ser NVARCHAR.

por exemplo, isso dará o erro porque @SQL precisa ser NVARCHAR

DECLARE @SQL VARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL

Assim:

DECLARE @SQL NVARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
AdaTheDev
fonte
Isso funciona, mas a outra resposta (de Daniel Renshaw) é MUITO mais útil, na maioria das vezes. (já que não precisa da declaração de variável inútil)
Brondahl
22

A solução é colocar um N na frente do tipo e da string SQL para indicar que é uma string de caracteres de byte duplo:

DECLARE @SQL NVARCHAR(100) 
SET @SQL = N'SELECT TOP 1 * FROM sys.tables' 
EXECUTE sp_executesql @SQL
Daniel Renshaw
fonte
0

Eu havia perdido outro pequeno detalhe: esqueci os colchetes "(100)" atrás do NVARCHAR.

Simaglei
fonte