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.