Dlaczego otrzymuję komunikat „Procedura oczekuje parametru„ @statement ”typu„ ntext / nchar / nvarchar ”.” kiedy próbuję użyć sp_executesql?

96

Dlaczego otrzymuję ten błąd

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

kiedy próbuję użyć sp_executesql?

Manoj Wadhwani
źródło
1
Jak próbujesz to wykonać? W T-SQL? Z programu? Czy przekazujesz wymagany parametr „@statement”?
Matt Hamilton,

Odpowiedzi:

217

Wygląda na to, że dzwonisz do sp_executesql z instrukcją VARCHAR, kiedy musi to być NVARCHAR.

np. spowoduje to błąd, ponieważ @SQL musi być NVARCHAR

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

Więc:

DECLARE @SQL NVARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
AdaTheDev
źródło
To działa, ale inna odpowiedź (od Daniela Renshawa) jest O WIELE bardziej użyteczna przez większość czasu. (ponieważ nie wymaga bezcelowej deklaracji zmiennej)
Brondahl
22

Rozwiązaniem jest umieszczenie N przed typem i ciągiem SQL, aby wskazać, że jest to dwubajtowy ciąg znaków:

DECLARE @SQL NVARCHAR(100) 
SET @SQL = N'SELECT TOP 1 * FROM sys.tables' 
EXECUTE sp_executesql @SQL
Daniel Renshaw
źródło
0

Pominąłem kolejny drobny szczegół: zapomniałem nawiasów „(100)” za NVARCHAR.

simaglei
źródło