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

Python向SQL Server插入数据时报Invalid column name错误如何排查

问题根源

你遇到的报错是直接拼接SQL字符串导致的语法解析异常:当你从irow中提取的strObj、strGrp字段值中包含单引号'时,会直接破坏你拼接出的INSERT语句结构,数据库会把被单引号截断的后续内容误识别为列名。

举个实际的异常场景:如果strObj的取值为User'Id,你拼接出的SQL会变成如下形式:

INSERT INTO dbo.ApiResults ([Object], [Group], json) VALUES ('User'Id','测试分组','Stuff');

数据库解析时会认为User是第一个插入值,后续的Id会被识别为列名匹配项,直接抛出你遇到的“incorrect column name”错误。

修复方案

不要手动拼接SQL字符串,改用SQL驱动支持的参数化查询写法即可,SQL Server对应的Python连接库(pyodbc、pymssql等)都支持?作为参数占位符,修改后的代码如下:

for irow in cursor.execute(storedProc):
    strObj = str(irow[0])
    strGrp = str(irow[1])
    print(strObj)
    print(strGrp)
    try:
        response = requests.get(irow[2], timeout=30, auth=('user', 'pw'))
        response.raise_for_status()
        strJson = "Stuff"
        # 替换原有拼接SQL的写法,使用参数化查询
        insert_sql = "INSERT INTO dbo.ApiResults ([Object], [Group], json) VALUES (?, ?, ?)"
        cursor.execute(insert_sql, (strObj, strGrp, strJson))

参数化查询会自动转义处理字段值中的特殊字符,除了解决当前的语法报错问题,还能避免SQL注入安全风险。

额外注意事项

你当前使用同一个cursor同时遍历存储过程的查询结果、执行插入操作,部分驱动下可能会出现未遍历完的结果集被插入操作覆盖的问题,如果后续遇到遍历提前终止的情况,可以单独创建一个新的cursor对象专门用于执行插入语句。


内容的提问来源于stack exchange,提问作者Doug Coats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:57:02