You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决通过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权限

代码其他优化点

  1. 方法调用需加括号:conn.close()和cursor.close(),否则不会执行关闭操作
  2. 移除多余的conn.commit():因为你在连接时设置了autocommit=True,手动提交会导致冲突
  3. 用f-string拼接SQL语句,比字符串相加更清晰易维护

内容的提问来源于stack exchange,提问作者Andrew Barrett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:31:00