Почему я получаю сообщение «Процедура ожидает параметр '@statement' типа 'ntext / nchar / nvarchar'». когда я пытаюсь использовать sp_executesql?

96

Почему я получаю эту ошибку

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

когда я пытаюсь использовать sp_executesql?

Манодж Вадхвани
источник
1
Как вы пытаетесь его выполнить? В T-SQL? Из программы? Вы передаете обязательный параметр «@statement»?
Мэтт Гамильтон,

Ответы:

217

Похоже, вы вызываете sp_executesql с оператором VARCHAR, когда это должно быть NVARCHAR.

например, это приведет к ошибке, потому что @SQL должен быть NVARCHAR

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

Так:

DECLARE @SQL NVARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
AdaTheDev
источник
Это действительно работает, но другой ответ (от Дэниела Реншоу) в большинстве случаев более полезен. (поскольку ему не нужно бессмысленное объявление переменной)
Brondahl
22

Решение состоит в том, чтобы поставить N перед типом и строкой SQL, чтобы указать, что это строка двухбайтовых символов:

DECLARE @SQL NVARCHAR(100) 
SET @SQL = N'SELECT TOP 1 * FROM sys.tables' 
EXECUTE sp_executesql @SQL
Дэниел Реншоу
источник
0

Я упустил еще одну крошечную деталь: я забыл скобки "(100)" позади NVARCHAR.

Simaglei
источник