2013-02-12 68 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