20

以下是 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除文档日期之外的每一列。

4

13 回答 13

16

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

在您的 BCP 呼叫之前尝试此操作:

EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
于 2014-03-20T08:31:17.217 回答
6

首先,通过执行简单的 'dir c:*.*' 来排除 xp_cmdshell 问题;

查看我关于使用 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

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


在此处输入图像描述

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

在此处输入图像描述

于 2013-09-04T17:16:42.817 回答
5

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

于 2014-02-06T08:03:27.380 回答
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"

问题解决了。

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

于 2015-09-21T11:53:03.950 回答
2

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

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

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

写下你的进展...

于 2013-09-04T16:55:31.657 回答
1

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

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

于 2019-11-28T13:30:22.913 回答
1

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

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

于 2019-06-28T02:18:52.777 回答
1

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

于 2020-03-01T21:38:13.097 回答
0

如果您使用一个课程,请从您的命令中删除 no_output

SET @sql = 'BCP ....'

EXEC master..xp_cmdshell @sql , no_output

EXEC master..xp_cmdshell @sql
于 2014-11-20T19:11:58.900 回答
0

在我的情况下,这个修复只是在管理员模式下运行。

于 2017-08-18T19:42:00.527 回答
0

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

于 2018-05-08T17:37:15.577 回答
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()
于 2019-04-08T10:48:43.540 回答
0

在 SQL 中使用 Job 时,使用 SQL express 服务器的用户是当前登录的用户,您应该在批处理写入输出的文件夹中授予该用户写入权限。

这通常只发生bcp在使用type命令时,所有权属于计算机(管理员)并且命令运行没有问题。

因此,如果您的工作中有很长的命令,只需查找 bcp 部分。

在此处输入图像描述

于 2021-11-03T18:02:40.957 回答