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

Python代码中T-SQL字符串条件查询语法报错问题咨询

T-SQL字符串值引用规则
  • 字符串字面量必须使用半角单引号'包裹,例如要表示字符串Other Expenses需要写为'Other Expenses'。如果字符串本身包含单引号,需要用两个连续单引号转义,例如要表示O'Conner需写为'O''Conner'。
  • 字符串等值判断使用=运算符,IS运算符仅用于NULL/NOT NULL的判断,不可用于普通值的比较。
  • 优先使用参数化查询传入字符串值,可避免手动拼接SQL引发的注入风险和引号转义问题。
现有代码的错误点
  • 别名不匹配:你给[dbo].[PostGL]定义的别名是gl,但后续JOIN、WHERE条件中使用的是未定义的别名genLedger,属于无效引用。
  • 运算符使用错误:判断字符串等于指定值时误用了IS运算符,应该使用=。
  • 字符串未正确包裹:Other Expenses作为字符串值没有加单引号,被SQL解析为标识符直接触发语法错误。
  • 参数传递错误:第一种修改方案中两个参数需要放在同一个列表内传入execute方法,不能分开传递两个独立的参数数组。
  • 第二种修改方案未给Other Expenses加单引号,依旧不符合字符串引用规则。
修复方案

方案1:参数化查询(推荐)

无需手动处理字符串引号,可避免SQL注入风险,修改后代码如下:

# 统一PostGL表的别名为gl,替换所有无效的genLedger引用
otherExpense ='''SELECT Master_Sub_Account, Debit, Credit FROM [dbo].[PostGL] as gl
         INNER JOIN Accounts  
         ON Accounts.AccountLink = gl.AccountLink 
         INNER JOIN _etblGLAccountTypes as AccountTypes 
         ON Accounts.iAccountType = AccountTypes.idGLAccountType 
         WHERE cAccountTypeDescription = ? 
         AND gl.TxDate >  ? '''

cursor = cnxn.cursor()
# 两个参数按顺序放在同一个列表中,和SQL中?的位置一一对应
cursor.execute(otherExpense, ['Other Expenses', one_yrs_ago])
xAllOtherExpense = cursor.fetchall()
cursor.close()
otherExpenseX = []

for row in xAllOtherExpense:
    rdict = {
        "Account": row[0],
        "Debit": row[1],
        "Credit": row[2]
    }
    otherExpenseX.append(rdict)

方案2:直接在SQL中写死字符串值

仅适合字符串值固定不变的场景,只需修改WHERE子句为如下格式即可(同时需修正别名不匹配的问题):

WHERE cAccountTypeDescription = 'Other Expenses' AND gl.TxDate > ?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:27:03