为啥我得到“程序需要'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? [复制]

为啥我没有得到任何回应

为啥我得到黑色纹理?

为啥我得到分段(核心转储)?

为啥我得到 getApplicationcontext() null?

为啥我不能从数组中得到正确的日期?