別の回答へのコメントに記載されているように、T-SQL BULK INSERT
コマンドは、インポートするファイルがSQL Serverインスタンスと同じマシン上にあるか、SQLServerインスタンスが読み取ることができるSMB/CIFSネットワークの場所にある場合にのみ機能します。したがって、ソースファイルがリモートクライアント上にある場合には適用できない可能性があります。
pyodbc 4.0.19は、その場合に役立つ可能性のあるCursor#fast_executemany機能を追加しました。 fast_executemany
デフォルトでは「オフ」であり、次のテストコード...
cnxn = pyodbc.connect(conn_str, autocommit=True)
crsr = cnxn.cursor()
crsr.execute("TRUNCATE TABLE fast_executemany_test")
sql = "INSERT INTO fast_executemany_test (txtcol) VALUES (?)"
params = [(f'txt{i:06d}',) for i in range(1000)]
t0 = time.time()
crsr.executemany(sql, params)
print(f'{time.time() - t0:.1f} seconds')
...テストマシンで実行するのに約22秒かかりました。 crsr.fast_executemany = True
を追加するだけです ...
cnxn = pyodbc.connect(conn_str, autocommit=True)
crsr = cnxn.cursor()
crsr.execute("TRUNCATE TABLE fast_executemany_test")
crsr.fast_executemany = True # new in pyodbc 4.0.19
sql = "INSERT INTO fast_executemany_test (txtcol) VALUES (?)"
params = [(f'txt{i:06d}',) for i in range(1000)]
t0 = time.time()
crsr.executemany(sql, params)
print(f'{time.time() - t0:.1f} seconds')
...実行時間を1秒強に短縮しました。