2013-02-12 67 views
-1

我在调用sp_executesql时遇到了问题,并且我传递了varchar参数。
我得到这个错误:用varchar参数调用sp_executesql

Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

+0

你可以发布你的sp? – 2013-02-12 08:41:00

回答

0

这意味着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 
+0

我正在构建一个动态查询的字段更改。 – 2013-02-12 09:06:44

0

试试这个:

例如这将给错误,因为@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 
+0

当我使用Nvarchar的@SQL修剪,并没有完成我必须使用Varchar而不是。 – 2013-02-12 08:51:32

+1

它被截断,因为这:http://stackoverflow.com/questions/1371383/for-nvarcharmax-i-am-only-getting-4000-characters-in-tsql/1371584#1371584 – gbn 2013-02-12 09:16:56

+0

我读它,但我没有得到如何解决我的问题。 – 2013-02-12 09:57:41

1

心理调试说,你要么被传递到SP_ExecuteSQL的变量键入varchar(使其成为nvarchar),或者您有一个字符串,但您没有使用unicode前缀:

例如

Exec sp_executesql 'select * from something' 

要修复它使用:

Exec sp_executesql N'select * from something' 

通知的N的字符串前缀。

+0

我构建@SQL作为varchar参数,然后将其传递给sp_executesql。 – 2013-02-12 08:54:43

+0

然后我告诉你如何解决它 - 将其声明为适当长度的nvarchar参数(如果需要超过4000个字符,请使用'nvarchar(max)')。 – Bridge 2013-02-12 09:00:41

+0

我做到了这一点,同样,@SQL修剪,并不能包含我建立的所有动态查询。 – 2013-02-12 09:10:07