用varchar参数调用sp_executesql
我在调用sp_executesql
时遇到了问题,并且我传递了varchar参数。
我得到这个错误:用varchar参数调用sp_executesql
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
这意味着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
我正在构建一个动态查询的字段更改。 – 2013-02-12 09:06:44
试试这个:
例如这将给错误,因为@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
当我使用Nvarchar的@SQL修剪,并没有完成我必须使用Varchar而不是。 – 2013-02-12 08:51:32
它被截断,因为这:http://stackoverflow.com/questions/1371383/for-nvarcharmax-i-am-only-getting-4000-characters-in-tsql/1371584#1371584 – gbn 2013-02-12 09:16:56
我读它,但我没有得到如何解决我的问题。 – 2013-02-12 09:57:41
心理调试说,你要么被传递到SP_ExecuteSQL
的变量键入varchar(使其成为nvarchar),或者您有一个字符串,但您没有使用unicode前缀:
例如
Exec sp_executesql 'select * from something'
要修复它使用:
Exec sp_executesql N'select * from something'
通知的N
的字符串前缀。
我构建@SQL作为varchar参数,然后将其传递给sp_executesql。 – 2013-02-12 08:54:43
然后我告诉你如何解决它 - 将其声明为适当长度的nvarchar参数(如果需要超过4000个字符,请使用'nvarchar(max)')。 – Bridge 2013-02-12 09:00:41
我做到了这一点,同样,@SQL修剪,并不能包含我建立的所有动态查询。 – 2013-02-12 09:10:07
你可以发布你的sp? – 2013-02-12 08:41:00