Как я могу указать входной файл sql с длинным запросом при использовании bcp? Я попытался использовать параметр -i
, но он продолжает жаловаться на ошибку в командной строке без дополнительной информации. Возможно ли это?
Могу ли я указать входной файл sql с bcp?
Ответ 1
Насколько мне известно, утилита BCP поддерживает только запросы Transact-SQL, непосредственно написанные в командной строке. Пример:
bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c
В соответствии с его ссылкой параметр -i:
Задает имя файла ответа, содержащего ответы на вопросы командной строки для каждого поля данных, когда массовая копия выполняется с использованием интерактивного режима (-n, -c, -w или -N не указывается).
Обратите внимание, что он отличается от sqlcmd Utility "-i":
Идентифицирует файл, содержащий пакет SQL-запросов или хранимых процедур. Можно указать несколько файлов, которые будут считаться и обрабатываться в порядке (...)
Ответ 2
У меня была эта проблема сегодня и нашел удобное обходное решение, по крайней мере, в ситуации ad-hoc.
Временные таблицы могут быть созданы любым пользователем с разрешениями на подключение. Это означает, что вы также можете создавать глобальные временные таблицы.
Просто запустите свой запрос в менеджере предприятия (или sql cmd или что-то еще), используя SELECT... INTO с глобальной временной таблицей, например.
SELECT *
INTO ##mytemptable
FROM SomeTable
WHERE [massive where clause, for example]
Затем вы можете использовать временную таблицу в запросе BCP с помощью простого
SELECT * FROM ##mytemptable
Затем отпустите таблицу temp через менеджер предприятия
DROP TABLE ##mytemptable
Ответ 3
Я сделал другой способ для исправления.
Я создаю командный файл, который читает файл и отправляет ваше содержимое в команду bcp. См:
@ECHO off
SETLOCAL EnableDelayedExpansion
SET queryFile=%1
SET outFileName=%2
FOR /F "delims=" %%i IN (%queryFile%) DO SET join=!join! %%i
ECHO %join%
bcp "%join%" queryout %outFileName% /S.\SQLE_CAESAR /d /c /t"|" /T
Чтобы script получили два параметра:
- Имя файла, у которого есть запрос;
- Имя файла для данных экспорта;
Выполнить a script в cmd следующим образом: export-query.bat query.sql export.txt
Я надеюсь, что помог.
Ответ 4
Многострочные запросы могут быть легко переданы в bcp с помощью powershell:
PS> $query = @'
select *
from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c
Ответ 5
У меня была такая же проблема, возможно, не очень хороший подход. Тем не менее, я сделал что-то вроде следующего
bcp "declare @query nvarchar(max) set @query = (SELECT * FROM OPENROWSET(BULK 'F:\tasks\report_v2.sql', SINGLE_CLOB) AS Contents) exec sp_executesql @query" queryout %outFileName% /c /C RAW -S . -U sa -P 123 -d blog /T
И я должен сказать, что если вы используете как глобальную временную таблицу, то глобальная временная таблица сама отбрасывается после выполнения запроса. Вы не можете использовать это в некоторых ситуациях
Ответ 6
пытаться:
query=$( cat < /file.sql )
export query
bcp "${query}" queryout /home/file.csv