Jak zauważono w komentarzu do innej odpowiedzi, T-SQL BULK INSERT
Polecenie będzie działać tylko wtedy, gdy plik do zaimportowania znajduje się na tym samym komputerze, co instancja SQL Server lub znajduje się w lokalizacji sieciowej SMB/CIFS, którą może odczytać instancja SQL Server. Dlatego może nie mieć zastosowania w przypadku, gdy plik źródłowy znajduje się na zdalnym kliencie.
pyodbc 4.0.19 dodał funkcję Cursor#fast_executemany, która może być pomocna w tym przypadku. fast_executemany
jest domyślnie wyłączone, a następujący kod testowy...
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')
... wykonanie na mojej maszynie testowej zajęło około 22 sekund. Po prostu dodając 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')
... skrócił czas wykonania do nieco ponad 1 sekundy.