【问题标题】:BULK INSERT error code 3: The system cannot find the path specifiedBULK INSERT 错误代码3:系统找不到指定的路径
【发布时间】:2017-03-01 16:33:23
【问题描述】:

我正在尝试使用 pyodbc 将本地文件批量插入远程 MS_SQL 数据库。我能够连接到数据库并且能够INSERT INTO 表,就像我之前所做的那样。我遇到问题的地方是BULK INSERT

我使用BULK INSERT 来加快我的INSERT 进程。

代码如下所示:

statement = """ BULK INSERT BulkTable FROM 'C:\\Users\\userName\\Desktop\\Folder\\Book1.csv' WITH (
       FIRSTROW=2,
       FIELDTERMINATOR=',',
       ROWTERMINATOR = '\\n'
);
"""
cursor.execute(statement)
cnxn.commit()

此代码产生此错误:

Traceback (most recent call last):
   File "tester.py", line 41, in <module> cursor.execute(statement)
   pyodbc.ProgrammingError: 
    ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]  Cannot bulk load because the file    "C:\\Users\\userName\\Desktop
\\Folder\\Book1.csv" could not be opened.
    Operating system error code 3(The system cannot find the path specified.). (4861) (SQLExecDirectW)')`

我真的不明白为什么它无法打开文件,因为路径绝对正确。

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 三引号字符串中的\\Desktop\\Folder 之间真的有换行符吗?这可能会搞砸事情。
  • 我摆脱了它,但这并没有帮助。我得到同样的错误。

标签: python sql-server bulkinsert pyodbc


【解决方案1】:

“我正在尝试将本地文件批量插入远程 MS_SQL 数据库”

您的方法不起作用,因为文件规范 'C:\\Users\\userName\\Desktop\\Folder\\Book1.csv' 只是运行 Python 代码的工作站上的有效路径,但 BULK INSERT documentation 解释说

data_file 必须从运行 SQL Server 的服务器指定一个有效路径。如果 data_file 是远程文件,请指定通用命名约定 (UNC) 名称。

(强调我的)。也就是说,BULK INSERT 语句正在在服务器上 运行,因此就服务器而言,某个其他机器(如您的工作站)上的文件规范实际上是一个“远程文件”。换句话说,SQL Server 会去寻找一个名为 C:\Users\userName\Desktop\Folder\Book1 的文件在服务器本身,当失败时,它会引发“找不到路径”错误。

要使用 BULK INSERT,您需要

  1. 将文件放在 SQL Server 可以“看到”的网络共享上,然后提供该文件的 UNC 路径,或者

  2. 将文件上传到 SQL Server 上的本地文件夹,然后提供文件的本地(服务器)路径。

如果这两种方法都不可行,那么您在 Python 中的另一个选择是使用 subprocess 模块调用 SQL Server 的 bcp utility 将本地文件中的数据上传到 SQL Server 数据库中。

【讨论】:

  • 嘿,谢谢。这是我的想法,但我不是 100% 确定。我很感激你的时间。我会尝试使用 subprocess 模块。
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2019-12-22
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2017-02-05
相关资源
最近更新 更多