Не удалось открыть файл данных узла BCP

Ниже приведен пример инструкции BCP. Я не привык использовать BCP, поэтому ваша помощь и откровенность очень ценятся

Я также использую его с файлом формата.

Если я выполняю из командной строки CMD, он работает нормально, но из SQL я получаю ошибку. Инструкция BCP находится в одной строке, а агент SQL Server работает как локальная система. SQL server и сценарий находятся в одной системе.

я запустил exec мастер..xp_fixeddrives C, 45589 E, 423686

Я пробовал выводить на C и E с тем же результатом

EXEC xp_cmdshell 'bcp "Select FILENAME, POLICYNUMBER, INSURED_DRAWER_100, POLICY_INFORMATION, DOCUMENTTYPE, DOCUMENTDATE, POLICYYEAR FROM data.dbo.max" queryout "E:StorageExportDatamax.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       "rn"           7     POLICYYEAR    

из-за формирования в этом посте последний столбец файла формата отрезан, но читает SQL_Latin1_General_CP1_CI_AS для каждого столбца другого, что documentdate.

8 ответов


во-первых, исключите проблему xp_cmdshell, выполнив простой 'dir c:*.*';

проверить мой блог при использовании BCP для экспорта файлов.

У меня были проблемы в моей системе, в которой я не мог найти путь к ППГ.ИСПОЛНЯЕМЫЙ.

либо измените переменную 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 Server0\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


существует ли выходной путь? BCP не создает папку перед попыткой создать файл.

попробуйте это перед вызовом BCP:

EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'

пожалуйста, проверьте, файл может быть открыт в другом приложении или программе. Если это так, bcp.exe не может заменить существующее содержимое файла.


В моем случае, я решил проблему следующим образом:

мои команды :

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"

проблема решена.

поэтому я думаю, что проблема возникла из-за превышения имени файла. таким образом, файл не найден.


Если он работает из командной строки, но не из агента SQL, я думаю, что это проблема аутентификации.

агент SQL Server работает под учетной записью. Убедитесь, что учетная запись имеет возможность читать файл формата и генерировать выходной файл.

кроме того, убедитесь, что учетная запись имеет возможность выполнить xp_cmdshell хранимая процедура.

напишите назад с вашим прогрессом ...


удалите no_output из вашей команды, если вы используете один offcourse

SET @sql = 'BCP ....'

EXEC master..xp_cmdshell @sql , no_output

EXEC master..xp_cmdshell @sql

в моем случае это исправление просто работало в режиме администратора.


в случае, если кто-то еще сталкивается с той же проблемой: у меня было ...lesPerson" queryout', а не ...lesPerson" queryout '