Не удалось открыть файл данных хоста 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

Я получил это после того, как я поделился своей выходной папкой, даже когда не было открытых файлов.

Я создал новую, общую папку для вывода, и все было хорошо. (может кому-то помочь ;-))