Jak je uvedeno v komentáři k jiné odpovědi, T-SQL BULK INSERT
příkaz bude fungovat pouze v případě, že soubor, který má být importován, je na stejném počítači jako instance SQL Server nebo je v síťovém umístění SMB/CIFS, které může instance SQL Serveru číst. Nemusí to být tedy použitelné v případě, kdy je zdrojový soubor na vzdáleném klientovi.
pyodbc 4.0.19 přidal funkci Cursor#fast_executemany, která může být v takovém případě užitečná. fast_executemany
je ve výchozím nastavení "vypnuto" a následující testovací kód ...
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')
... trvalo přibližně 22 sekund provedení na mém testovacím počítači. Stačí přidat 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')
... zkrátil dobu provádění na něco málo přes 1 sekundu.