为啥我得到“程序需要'ntext/nchar/nvarchar'类型的参数'@statement'。”当我尝试使用 sp_executesql 时?
Posted
技术标签:
【中文标题】为啥我得到“程序需要\'ntext/nchar/nvarchar\'类型的参数\'@statement\'。”当我尝试使用 sp_executesql 时?【英文标题】:Why do I get "Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'." when I try to use sp_executesql?为什么我得到“程序需要'ntext/nchar/nvarchar'类型的参数'@statement'。”当我尝试使用 sp_executesql 时? 【发布时间】:2011-02-14 04:37:27 【问题描述】:为什么会出现这个错误
过程需要“ntext/nchar/nvarchar”类型的参数“@statement”。
当我尝试使用sp_executesql
时?
【问题讨论】:
你是如何尝试执行它的?在 T-SQL 中?从一个程序?您是否传递了所需的“@statement”参数? 【参考方案1】:听起来您正在使用 VARCHAR 语句调用 sp_executesql,但它需要是 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)在大多数情况下更有用。 (因为它不需要无意义的变量声明)【参考方案2】:解决办法是在类型和SQL字符串前面都放一个N,表示是双字节字符串:
DECLARE @SQL NVARCHAR(100)
SET @SQL = N'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
【讨论】:
【参考方案3】:我错过了另一个小细节:我忘记了 NVARCHAR 后面的括号“(100)”。
【讨论】:
以上是关于为啥我得到“程序需要'ntext/nchar/nvarchar'类型的参数'@statement'。”当我尝试使用 sp_executesql 时?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我得到一个 nullPointerException? [复制]