เหตุใดฉันจึงได้รับ“ ขั้นตอนคาดหวังพารามิเตอร์ '@statement' ประเภท 'ntext / nchar / nvarchar'” เมื่อฉันพยายามใช้ sp_executesql?


96

เหตุใดฉันจึงได้รับข้อผิดพลาดนี้

โพรซีเดอร์ต้องการพารามิเตอร์ '@statement' ของประเภท 'ntext / nchar / nvarchar'

เมื่อฉันพยายามใช้sp_executesql?


1
คุณพยายามดำเนินการอย่างไร? ใน T-SQL? จากโปรแกรม? คุณกำลังส่งพารามิเตอร์ "@statement" ที่จำเป็นหรือไม่
Matt Hamilton

คำตอบ:


218

ดูเหมือนว่าคุณกำลังเรียกใช้ 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

วิธีนี้ได้ผล แต่คำตอบอื่น ๆ (จาก Daniel Renshaw) คือวิธีที่มีประโยชน์มากกว่าโดยส่วนใหญ่แล้ว (เนื่องจากไม่จำเป็นต้องมีการประกาศตัวแปรแบบไม่มีจุดหมาย)
Brondahl

23

วิธีแก้ปัญหาคือใส่ N ไว้หน้าทั้งชนิดและสตริง SQL เพื่อระบุว่าเป็นสตริงอักขระแบบไบต์คู่:

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

0

ฉันพลาดรายละเอียดเล็ก ๆ น้อย ๆ อีกอย่าง: ฉันลืมวงเล็บ "(100)" ที่อยู่ด้านหลัง NVARCHAR

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.