SQLState = 37000, NativeError = 137: необходимо объявить скалярную переменную @result.

Когда я запускаю следующий код для вывода запроса Sql в файл, он работает нормально:

exec xp_cmdshell 'bcp "SELECT top 5 * from NK.[dbo].[eclubCustomerDelta]" queryout c:\nk\contacts.txt -c -T'

Но я сохранил свой запрос в другой переменной ранее в коде:

SET @result = (SELECT @x,@y
FOR XML PATH('contacts'))

@x и @y сами по себе являются переменными, определенными ранее (запрос дает правильный результат при повторном запуске). При этом аналогичный вывод запроса, похоже, не работает:

exec xp_cmdshell 'bcp "SELECT @result" queryout c:\nk\contacts.txt -c -T'

Вот как выглядит мой вывод:

Запуск копирования...

SQLState = 37000, NativeError = 137

Ошибка = [Microsoft] [Драйвер ODBC 13 для SQL Server] [SQL Server] должен объявить скалярную переменную «@result».

SQLState = S1000, NativeError = 0

Ошибка = [Microsoft] [Драйвер ODBC 13 для SQL Server] Не удается разрешить параметры сортировки на уровне столбцов.

Ошибка копирования BCP


person disasterkid    schedule 01.02.2017    source источник
comment
Вы передаете аргументы командной строки утилите командной строки bcp, которая является отдельным исполняемым файлом. Почему вы ожидаете, что этот отдельный exe сможет увидеть ваш @result?   -  person GSerg    schedule 01.02.2017
comment
попробуйте экранировать символ @   -  person E LaRoche    schedule 01.02.2017
comment
Возможный дубликат Передача переменной в xp_cmdshell   -  person GSerg    schedule 01.02.2017
comment
@GSerg согласен, но не могли бы вы показать мне дорогу? в приведенном выше коде мой @result является переменной Xml. Я не думаю, что мой вопрос является дубликатом. Другой вопрос имеет другую команду и не имеет ничего общего с Xml.   -  person disasterkid    schedule 01.02.2017
comment
@Disasterkid Неважно, что содержит ваша переменная. Дело в том, что вы помещаете содержимое или переменную в командную строку, как вы это делаете с динамическим SQL.   -  person GSerg    schedule 01.02.2017
comment
@GSerg запрос SELECT @result именно то, что мне нужно. Если я помещу весь свой запрос в команду bcp, мой код станет очень трудно читать.   -  person disasterkid    schedule 01.02.2017
comment
@Disasterkid Тогда также поместите SET @result = ... в свою команду перед select @result, которому предшествует все остальное, на что есть ссылка в set. Если вам это тоже не нравится, создайте хранимую процедуру/функцию с этим кодом и вызовите ее по имени из команды.   -  person GSerg    schedule 01.02.2017
comment
Моя переменная @result @GSerg также содержит ссылки на другие переменные. Должен ли я поместить весь запрос в команду bcp? Нет ли более чистого способа сделать это?   -  person disasterkid    schedule 01.02.2017