【发布时间】:2018-02-26 23:35:33
【问题描述】:
当我调用 sp_executesql 并传递 varchar 参数时遇到问题。
我收到了这个错误:
过程需要类型为“@statement”的参数 'ntext/nchar/nvarchar'。
【问题讨论】:
标签: sql sql-server-2008
当我调用 sp_executesql 并传递 varchar 参数时遇到问题。
我收到了这个错误:
过程需要类型为“@statement”的参数 'ntext/nchar/nvarchar'。
【问题讨论】:
标签: sql sql-server-2008
心理调试器说你要么传递给SP_ExecuteSQL一个varchar类型的变量(让它变成nvarchar),要么你有一个没有使用unicode前缀的字符串:
例如
Exec sp_executesql 'select * from something'
要修复它,请使用:
Exec sp_executesql N'select * from something'
注意字符串上的N 前缀。
【讨论】:
nvarchar 参数(如果需要超过 4000 个字符,请使用 nvarchar(max))。
Exec 一起使用而不是使用sp_executesql(如果您不使用参数应该很容易测试)。另外,为什么不将您的脚本分成批次?我怀疑它需要那么长。
这意味着sp_executesql 的@statement 参数需要nvarchar。
这不意味着你的参数必须是nvarchar。
当然,如果你没有参数,你为什么要使用 sp_executesql?
CREATE TABLE #foo (bar varchar(100) NOT NULL);
DECLARE @filter varchar(100) = 'bob';
EXEC sys.sp_executesql
N'SELECT * FROM #foo WHERE bar = @p1', --NVARCHAR because of N prefix
N'@p1 varchar(100)', --NVARCHAR because of N prefix
@filter --VARCHAR
DROP TABLE #foo
【讨论】:
试试这个:
例如这将给出错误,因为@SQL 需要是 NVARCHAR
下面给出错误:
DECLARE @SQL VARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
所以:使用NVARCHAR(100)
DECLARE @SQL NVARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
【讨论】: