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

Python执行含反斜杠单引号的SQL查询报语法错误如何解决

Python对接SQL Server查询时特殊字符(反斜杠+单引号)的正确处理方案

报错核心原因

之前的写法存在两个关键错误:

  • SQL Server语法规则中,字符串常量内部的单引号必须转义为两个连续单引号,而非用反斜杠转义。之前写的'IDL\\DOC\\'TAB_...'片段中,\\'会被SQL解析为字符串结束标记,后续的TAB_会被判定为非法语法片段,直接触发102语法错误。
  • 直接用.format()拼接SQL语句属于不规范写法,既需要同时兼顾Python字符串转义、SQL语法转义两层规则极易出错,还存在SQL注入风险。

推荐方案:使用pyodbc原生参数化查询

pyodbc的参数化查询会自动完成所有特殊字符的转义适配,不需要手动处理反斜杠、单引号的转义逻辑,从根源避免语法错误,代码如下:

from datetime import date

# 第一步:在Python侧构造需要匹配的完整字段值,仅需遵守Python本身的字符串语法即可
# Python中字面反斜杠需要写为双反斜杠,这是Python语法要求,和SQL无关
match_year = date.today().year
target_cie = "TAB_"
target_tablecode = f"IDL\\DOC'TAB_'\\'{match_year}'FV'\\'          ' "

# 第二步:用?作为参数占位符写SQL,参数以元组形式传入execute方法,不要手动拼接进SQL字符串
c.execute(
    "SELECT Num FROM Table WHERE cie = ? AND tablecode = ?",
    (target_cie, target_tablecode)
)

手动拼接写法(仅作原理演示,生产环境禁止使用)

如果一定要手动拼接SQL,必须同时满足两层转义要求:

  1. Python字符串层面:每个字面反斜杠写为\\
  2. SQL语法层面:每个字面单引号写为''(两个连续单引号)
    示例代码:
from datetime import date
match_year = date.today().year
# 注意单引号全部替换为双单引号,反斜杠在Python中双写
sql_statement = f"SELECT Num FROM Table WHERE cie = 'TAB_' AND tablecode = 'IDL\\DOC''TAB_''\\''{match_year}''FV''\\''          ' '"
c.execute(sql_statement)

转义规则说明:SQL Server默认不将反斜杠识别为转义字符,仅对字符串内的单引号有转义要求。手动拼接需要同时处理两层转义逻辑,漏改任意一处就会触发语法错误,因此无特殊情况必须使用参数化查询。

内容的提问来源于stack exchange,提问作者IT-SRL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:40:36