web-dev-qa-db-ja.com

BULK INSERTエラーコード3:システムは指定されたパスを見つけることができません

Pyodbcを使用してローカルファイルをリモートMS_SQLデータベースに一括挿入しようとしています。 DBに接続でき、INSERT INTOテーブル、以前に行ったように。私が問題を抱えているのはBULK INSERT

使ってます BULK INSERTINSERTプロセスを高速化する方法として。

コードは次のようになります。

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)')`

パスが間違いなく正しいので、なぜファイルを開けないのか、本当にわかりません。

さらに情報が必要な場合はお知らせください。

6
Grant Herman

"リモートMS_SQLデータベースにローカルファイルを一括挿入しようとしています"

ファイル指定'C:\\Users\\userName\\Desktop\\Folder\\Book1.csv'は、Pythonコードを実行しているワークステーション上の有効なパスにすぎませんが、 BULK INSERTのドキュメント であるため、アプローチは機能していませんそれを説明します

data_fileは、SQL Serverが実行されているサーバーからの有効なパスを指定する必要がありますdata_fileがリモートファイルの場合は、UNC(Universal Naming Convention)名を指定します。

(強調鉱山)。つまり、BULK INSERTステートメントが実行中サーバー上なので、サーバーに関する限り、他のマシン(ワークステーションなど)のファイル指定は実際には「リモートファイル」です。つまり、SQL ServerはC:\Users\userName\Desktop\Folder\Book1サーバー自体という名前のファイルを探し、それが失敗すると「パスが見つかりません」というエラーが発生します。

BULK INSERTを使用するには、次のいずれかが必要です。

  1. sQL Serverが「参照」できるネットワーク共有にファイルを置き、そのファイルへのUNCパスを指定する、または

  2. sQL Serverのローカルフォルダーにファイルをアップロードし、ファイルのローカル(サーバー)パスを指定します。

これらの選択肢のいずれも実現可能でない場合、Pythonからの他のオプションは、SQL Serverの bcpユーティリティ を呼び出すために subprocess モジュールを使用することです)ローカルファイルからSQL Serverデータベースへのデータ。

12
Gord Thompson