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

pyodbc报错:SQL含1个参数标记,却传入2个参数

问题:pyodbc参数不匹配报错排查

我运行以下代码时遇到参数不匹配的报错,试了好几种方法都解决不了,麻烦帮我看看哪里错了?

我的Python代码

tmp = '''SELECT JSON_QUERY(formdata, '$."?-container"') from Disclosures where disclosureid = ?'''
print(tmp)
print ([itemType, disclosureID])
db.execute(tmp, itemType, disclosureID)
return db.fetchone()[0]

代码执行时的打印输出:

SELECT JSON_QUERY(formdata, '$."?-container"') from Disclosures where disclosureid = ?
['gift', 1]

报错信息

pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 2 parameters were supplied', 'HY000')

表结构DDL

CREATE TABLE [dbo].[Disclosures](
 [disclosureid] [int] IDENTITY(1,1) NOT NULL,
 [orgid] [int] NOT NULL,
 [userid] [int] NOT NULL,
 [formdata] [nvarchar](max) NOT NULL,
 [retain] [bit] NULL,
 [reportsassigned] [bit] NULL,
 CONSTRAINT [PK__Disclosu__F6B145D3D95E8196] PRIMARY KEY CLUSTERED ( [disclosureid] ASC)
);

问题原因&解决方法

核心问题

你误以为'$."?-container"'里的?是参数占位符,但实际上pyodbc只会识别**SQL语句中独立的?**作为参数占位符——字符串常量里的?会被当成普通字符,不会被解析成参数位。所以你的SQL语句里实际只有1个参数(where disclosureid = ?里的那个),但你传了2个参数,导致不匹配报错。

解决方法

方法一:参数化JSON路径(推荐,更安全)

先把itemType拼接成完整的JSON路径字符串,再把路径作为参数传入SQL:

# 构造带itemType的JSON路径
json_path = f'$."{itemType}-container"'
# 把JSON路径设为参数占位符
tmp = '''SELECT JSON_QUERY(formdata, ?) from Disclosures where disclosureid = ?'''
# 传入路径和disclosureID两个参数
db.execute(tmp, json_path, disclosureID)
return db.fetchone()[0]

方法二:直接拼接SQL语句(注意安全)

如果itemType是内部可控的值(不是用户输入),可以直接把路径拼到SQL里:

# 直接拼接JSON路径到SQL语句中
tmp = f'''SELECT JSON_QUERY(formdata, '$."{itemType}-container"') from Disclosures where disclosureid = ?'''
# 只需要传入disclosureID一个参数
db.execute(tmp, disclosureID)
return db.fetchone()[0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:50:06