2017-03-01 428 views
2

我正尝试使用pyodbc将本地文件批量插入远程MS_SQL数据库。我可以连接到数据库,我可以使用INSERT INTO表格,就像我以前做过的那样。我一直有问题的地方是BULK INSERTBULK INSERT错误代码3:系统找不到指定的路径

我使用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)')` 

我真的不明白为什么它不能打开文件的路径是完全正确。

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

+0

你的三引号字符串中'\\ Desktop'和'\\ Folder'之间是否真的有换行符?这可能会搞砸了。 –

+0

我摆脱了它,这并没有帮助。我犯了同样的错误。 –

回答

4

“我想批量插入本地文件到远程MS_SQL数据库”

你的做法是不工作,因为该文件规范'C:\\Users\\userName\\Desktop\\Folder\\Book1.csv'仅运行Python代码在工作站上的有效路径,但BULK INSERT documentation解释,

data_file must specify a valid path from the server on which SQL Server is running. If data_file is a remote file, specify the Universal Naming Convention (UNC) name.

(强调我的)。也就是说,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数据库。

+0

嘿,谢谢你。这是我的想法,但我不是100%肯定的。我感谢你的时间。我将尝试使用子流程模块。 –

相关问题