2013-02-12 3 views

ответ

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

Я создаю динамический запрос, где поля меняются. –

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 вместо. –

+1

Он усекается из-за этого: http://stackoverflow.com/questions/1371383/for-nvarcharmax-i-am-only-getting-4000-characters-in-tsql/1371584#1371584 – gbn

+0

Я читал его, но я не понял, как решить мою проблему. –

1

Psychic отладчик говорит, что вы либо переходят к SP_ExecuteSQL переменной type varchar (make nvarchar), или у вас есть строка, которую вы не использовали префикс unicode:

Например

Exec sp_executesql 'select * from something' 

Чтобы исправить это использовать:

Exec sp_executesql N'select * from something' 

Обратите внимание на N префикс на строку.

+0

Я строю параметр @SQL как varchar, а затем передаю его sp_executesql. –

+0

Затем я рассказал вам, как это исправить - объявите его как параметр «nvarchar» соответствующей длины (если требуется больше 4000 символов, используйте 'nvarchar (max)'). – Bridge

+0

Я сделал это и то же самое, @SQL обрезал и не может содержать весь динамический запрос, который я построил. –

Смежные вопросы