无法打开BCP主机数据文件

时间:2013-09-04 16:21:26

标签: sql sql-server bcp

以下是BCP声明的示例。 我不习惯使用BCP,所以非常感谢你的帮助和坦率

我也在使用格式文件。

如果我从CMD提示执行它可以正常工作但是从SQL我得到错误。 BCP语句全部在一行,SQL Server代理作为本地系统运行。 SQL服务器和脚本位于同一系统上。

我运行了exec master..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:\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

12 个答案:

答案 0 :(得分:14)

输出路径是否存在?在尝试创建文件之前,BCP不会创建该文件夹。

在BCP通话前尝试此操作:

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

答案 1 :(得分:5)

首先,通过做一个简单的'dir c:*。*'来排除xp_cmdshell问题;

使用BCP导出文件,查看my blog

我的系统出现问题,我无法找到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

在将SQL Server 2012的路径更改为\ 110 \并将数据库名称更改为[AdventureWorks2012]之前,我收到以下错误。


enter image description here

进行更改后,代码在SSMS中正常运行。该服务在NT AUTHORITY \ Local Service下运行。 SQL Server代理已禁用。输出文件已创建。

enter image description here

答案 2 :(得分:5)

请检查,该文件可能会在其他应用程序或程序中打开。 如果是这种情况,bcp.exe无法覆盖现有的文件内容。

答案 3 :(得分: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"

问题解决了。

所以我猜问题是由于文件名超出而发生的。因此找不到该文件。

答案 4 :(得分:2)

如果它从命令行运行但不是从SQL代理运行,我认为这是一个身份验证问题。

SQL Server代理正在一个帐户下运行。确保该帐户能够读取格式文件并生成输出文件。

此外,请确保该帐户能够执行xp_cmdshell存储过程。

回复你的进展......

答案 5 :(得分:0)

如果您使用一个场外话,请从命令中删除no_output

SET @sql = 'BCP ....'

EXEC master..xp_cmdshell @sql , no_output

EXEC master..xp_cmdshell @sql

答案 6 :(得分:0)

在我的情况下,此修复程序只是以管理员模式运行。

答案 7 :(得分:0)

如果其他人遇到同样的问题:我有...lesPerson" queryout'而不是...lesPerson" queryout '

答案 8 :(得分:0)

如果您的代码正在编写数据文件,然后使用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()

答案 9 :(得分:0)

共享输出文件夹后,即使没有打开的文件,我也收到了这个消息。

我创建了一个新的非共享文件夹以进行输出,一切都很好。 (可能会帮助某人;-))

答案 10 :(得分:0)

此错误可能是由于对目标文件夹的写权限不足所致。

这是一个常见问题,因为编写查询的用户可能有权访问文件夹,但是实际上调用bcp.exe的SQL Server代理或登录服务器帐户可能没有权限。

答案 11 :(得分:0)

目标路径必须已经存在(文件名除外)。