Neden "Prosedür" ntext / nchar / nvarchar "türünde" @statement "parametresi bekliyor" mesajı alıyorum. sp_executesql kullanmaya çalıştığımda?


96

Neden bu hatayı alıyorum

Prosedür, 'ntext / nchar / nvarchar' türündeki '@statement' parametresini bekliyor.

Ben kullanmaya çalıştığınızda sp_executesql?


1
Nasıl yürütmeye çalışıyorsun? T-SQL'de mi? Bir programdan mı? Gerekli "@statement" parametresini iletiyor musunuz?
Matt Hamilton

Yanıtlar:


218

NVARCHAR olması gerektiğinde sp_executesql'yi bir VARCHAR deyimiyle çağırıyormuşsunuz gibi görünüyor.

Örneğin, @SQL'in NVARCHAR olması gerektiğinden bu hata verecektir

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

Yani:

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

Bu işe yarıyor, ancak diğer yanıt (Daniel Renshaw'dan) çoğu zaman ÇOK daha yararlıdır. (anlamsız değişken bildirimine ihtiyaç duymadığından)
Brondahl

23

Çözüm, çift baytlık bir karakter dizesi olduğunu belirtmek için hem türün hem de SQL dizesinin önüne bir N koymaktır:

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

0

Küçük bir ayrıntı daha kaçırmıştım: NVARCHAR'ın arkasındaki "(100)" köşeli parantezleri unuttum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.