Когда я запускаю следующий код для вывода запроса 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
bcp
, которая является отдельным исполняемым файлом. Почему вы ожидаете, что этот отдельный exe сможет увидеть ваш@result
? - person GSerg   schedule 01.02.2017@result
является переменной Xml. Я не думаю, что мой вопрос является дубликатом. Другой вопрос имеет другую команду и не имеет ничего общего с Xml. - person disasterkid   schedule 01.02.2017SELECT @result
именно то, что мне нужно. Если я помещу весь свой запрос в командуbcp
, мой код станет очень трудно читать. - person disasterkid   schedule 01.02.2017SET @result = ...
в свою команду передselect @result
, которому предшествует все остальное, на что есть ссылка вset
. Если вам это тоже не нравится, создайте хранимую процедуру/функцию с этим кодом и вызовите ее по имени из команды. - person GSerg   schedule 01.02.2017@result
@GSerg также содержит ссылки на другие переменные. Должен ли я поместить весь запрос в команду bcp? Нет ли более чистого способа сделать это? - person disasterkid   schedule 01.02.2017