BULK INSERT错误代码3:系统找不到指定的路径

时间:2017-03-01 16:33:23

标签: python sql-server bulkinsert pyodbc

我正在尝试使用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)')`

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

如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:9)

&#34;我正在尝试将本地文件批量插入远程MS_SQL数据库&#34;

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

  

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

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

为了使用BULK INSERT,你需要

  1. 将文件放在SQL Server可以&#34;查看&#34;的网络共享上,然后提供该文件的UNC路径,或

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

  3. 如果这些替代方案都不可行,那么Python的另一个选择是使用subprocess模块调用SQL Server的bcp utility将数据从本地文件上传到SQL服务器数据库。