2017-03-01 307 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%肯定的。我感謝你的時間。我將嘗試使用子流程模塊。 –

相關問題