如何解决通过pyodbc批量插入MS SQL时的FORMAT语法错误
解决BULK INSERT语法错误:Incorrect syntax near 'FORMAT'
核心原因:SQL Server版本不兼容
FORMAT='CSV'是SQL Server 2017(14.x)及更高版本才支持的语法。如果你的SQL Server版本低于2017,执行时必然会触发这个语法错误。
针对性解决方案
情况1:SQL Server版本低于2017
直接移除FORMAT='CSV'参数,通过FIELDTERMINATOR、ROWTERMINATOR等参数手动定义文件格式:
修改后的Python代码中insert_data方法的查询语句:
def insert_data(self, conn, csv_file_nm, db_table_nm): # 替换为兼容低版本的BULK INSERT语句 qry = f"BULK INSERT {db_table_nm} FROM '{csv_file_nm}' WITH ( " \ f"FIRSTROW = 2, " \ f"FIELDTERMINATOR = '|', " \ f"ROWTERMINATOR = '\\n' " \ f")" # 如果CSV字段有引号包裹,添加FIELDQUOTE和ESCAPECHAR参数 # qry = f"BULK INSERT {db_table_nm} FROM '{csv_file_nm}' WITH ( " \ # f"FIRSTROW = 2, " \ # f"FIELDTERMINATOR = '|', " \ # f"ROWTERMINATOR = '\\n', " \ # f"FIELDQUOTE = '\"', " \ # f"ESCAPECHAR = '\"' " \ # f")" cursor = conn.cursor() cursor.execute(qry) cursor.close() # 注意加括号调用方法
情况2:SQL Server版本≥2017
如果版本符合要求仍报错,排查以下问题:
- 路径格式错误:你当前的路径
r"C:filepath/filename.csv"缺少根目录反斜杠,应改为r"C:\filepath\filename.csv"(Windows系统建议用双反斜杠,r前缀会自动转义) - 语法细节问题:检查WITH子句的参数是否用逗号正确分隔,确保括号配对无遗漏
- 权限不足:执行BULK INSERT的Windows账号需要有CSV文件所在路径的读取权限,以及目标数据库表的INSERT权限
代码其他优化点
- 方法调用需加括号:
conn.close()和cursor.close(),否则不会执行关闭操作 - 移除多余的
conn.commit():因为你在连接时设置了autocommit=True,手动提交会导致冲突 - 用f-string拼接SQL语句,比字符串相加更清晰易维护
内容的提问来源于stack exchange,提问作者Andrew Barrett
相关产品推荐
相关产品推荐

