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
相关产品推荐
相关产品推荐

