Như đã lưu ý trong một nhận xét cho một câu trả lời khác, T-SQL BULK INSERT
lệnh sẽ chỉ hoạt động nếu tệp được nhập nằm trên cùng một máy với phiên bản SQL Server hoặc nằm trong vị trí mạng SMB / CIFS mà phiên bản SQL Server có thể đọc. Do đó, nó có thể không áp dụng được trong trường hợp tệp nguồn nằm trên máy khách từ xa.
pyodbc 4.0.19 đã thêm tính năng Cursor # fast_executemany có thể hữu ích trong trường hợp đó. fast_executemany
được "tắt" theo mặc định và mã kiểm tra sau ...
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')
... mất khoảng 22 giây để thực thi trên máy thử nghiệm của tôi. Chỉ cần thêm 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')
... đã giảm thời gian thực hiện xuống chỉ còn hơn 1 giây.