Не удалось открыть файл данных хоста BCP
Ниже приведен пример заявления BCP.
Я не привык использовать BCP, поэтому ваша помощь и откровенность очень ценятся.
Я использую его также в файле формата.
Если я выполню из приглашения CMD, он отлично работает, но из SQL я получаю ошибку.
Оператор BCP находится в одной строке, а агент SQL Server работает как локальная система.
Сервер SQL и script находятся в одной системе.
Я запустил exec master..xp_fixeddrives
С, 45589
Е, 423686
Я пробовал вывод на C и E с тем же результатом
EXEC xp_cmdshell 'bcp "Select FILENAME, POLICYNUMBER, INSURED_DRAWER_100, POLICY_INFORMATION, DOCUMENTTYPE, DOCUMENTDATE, POLICYYEAR FROM data.dbo.max" queryout "E:\Storage\Export\Data\max.idx" -fmax-c.fmt -SSERVERNAME -T
Вот файл формата rmax-c.fmt
10.0
7
1 SQLCHAR 0 255 "$#Y#$" 1 FILENAME
2 SQLCHAR 0 40 "" 2 POLICYNUMBER
3 SQLCHAR 0 40 "" 3 INSURED_DRAWER_100
4 SQLCHAR 0 40 "" 4 POLICY_INFORMATION
5 SQLCHAR 0 40 "" 5 DOCUMENTTYPE
6 SQLCHAR 0 40 "" 6 DOCUMENTDATE
7 SQLCHAR 0 8 "\r\n" 7 POLICYYEAR
Из-за формирования в этом сообщении последний столбец файла формата обрезается, но читает SQL_Latin1_General_CP1_CI_AS
для каждого столбца, другого документа, документированного.
Ответы
Ответ 1
Во-первых, исключите проблему с xp_cmdshell, выполнив простое 'dir c: *. *';
Проверьте мой блог об использовании BCP для экспорта файлов.
У меня были проблемы в моей системе, в которых я не мог найти путь к BCP.EXE.
Либо измените переменную PATH жесткого кода.
Пример ниже работает с Adventure Works.
-- BCP - Export query, pipe delimited format, trusted security, character format
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) =
' cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ & ';
SET @bcp_cmd4 = @exe_path4 +
' BCP.EXE "SELECT FirstName, LastName FROM AdventureWorks2008R2.Sales.vSalesPerson" queryout ' +
' "C:\TEST\PEOPLE.TXT" -T -c -q -t0x7c -r\n';
PRINT @bcp_cmd4;
EXEC master..xp_cmdshell @bcp_cmd4;
GO
Прежде чем изменить путь на\110\для SQL Server 2012 и имя базы данных на [AdventureWorks2012], я получил следующую ошибку.
![enter image description here]()
После внесения изменений код работает из SSMS. Служба работает под NT AUTHORITY\Local Service. Агент SQL Server отключен. Выходной файл создан.
![enter image description here]()
Ответ 2
Существует ли путь вывода? BCP не создает папку перед попыткой создать файл.
Попробуйте это перед вызовом BCP:
EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
Ответ 3
Пожалуйста, проверьте, что файл может быть открыт в другом приложении или программе.
Если это так, bcp.exe не может перезаписать существующее содержимое файла.
Ответ 4
В моем случае я решил проблему следующим образом:
моя команда была:
bcp "select Top 1000 * from abc.dbo.abcd" queryout FileNameWithDirectory -c -t "|" -r "0x0a" -S 192.111.1.111 -U xx -P xxxxx
Мой FileNameWithDirectory был слишком длинным. как "D:\project-abc\R&D\abc-608\FilesNeeded\FilesNeeded\DataFiles\abc.csv"
.
Я перехожу в более простой каталог, например: "D:\abc.csv"
Проблема решена.
Итак, я думаю, проблема возникла из-за превышения имени файла. поэтому файл не найден.
Ответ 5
Если он работает из командной строки, но не от агента SQL, я думаю, что это проблема проверки подлинности.
Агент SQL Server работает под учетной записью. Убедитесь, что учетная запись имеет возможность читать файл формата и генерировать выходной файл.
Кроме того, убедитесь, что учетная запись имеет возможность выполнить хранимую процедуру xp_cmdshell.
Запишите свой прогресс...
Ответ 6
Удалите no_output из вашей команды, если вы используете один минус
SET @sql = 'BCP ....'
EXEC master..xp_cmdshell @sql , no_output
EXEC master..xp_cmdshell @sql
Ответ 7
В моем случае это исправление было просто запущено в режиме администратора.
Ответ 8
В случае, если кто-то ...lesPerson" queryout'
той же проблемой: у меня было ...lesPerson" queryout'
а не ...lesPerson" queryout '
Ответ 9
Если ваш код записывает файл данных, а затем читает его с помощью BCP, убедитесь, что вы ЗАКРЫВАЕТЕ ФАЙЛ ДАННЫХ, прежде чем пытаться его прочитать!
Невыполнение этого дает: "Невозможно открыть файл данных хоста".
Пример Python:
# Management of temporary bulk insert file.
def openBulkInsertFile(self) :
self.bulkInsertFile = open('c:/tmp/bulkInsertContent.txt', 'w', newline='')
self.csvWriter = csv.writer(self.bulkInsertFile)
def closeBulkInsertFile(self) :
self.bulkInsertFile.close()
Ответ 10
Я получил это после того, как я поделился своей выходной папкой, даже когда не было открытых файлов.
Я создал новую, общую папку для вывода, и все было хорошо. (может кому-то помочь ;-))