Python连接SQL Server查询PB040_NG_Count表遇FROM语法错误求助
问题排查与解决方案
这个报错的根源非常直观——字符串拼接时表名和WHERE关键字之间缺少空格,导致最终生成的SQL语句变成了FROM PB040_NG_CountWHERE...,SQL Server根本无法识别这种语法混乱的内容。
你可以仔细看这段拼接代码:
" FROM PB040_NG_Count" + " WHERE read_at_2 BETWEEN '" + query_start_time + "'" + " AND CURRENT_TIMESTAMP" + " ORDER BY read_at_2 ASC"
PB040_NG_Count后面没有空格,拼接后直接跟了WHERE,完全破坏了SQL的语法结构。而你之前能用的原代码里,PC030_NG_Count后面应该是带有空格的,所以切换回去就不会出错。
修正后的代码
只需要在表名后面加一个空格即可:
cursor.execute("SELECT CAST(read_at_2 AS datetime),cell,station," + " CAST(Color_NG AS float)/NULLIF(Total_Production,0)," + " CAST(Angle_NG AS float)/NULLIF(Total_Production,0)," + " CAST(ID_NG AS float)/NULLIF(Total_Production,0)," + " CAST(OD_NG AS float)/NULLIF(Total_Production,0)," + " CAST(Height_NG AS float)/NULLIF(Total_Production,0)" + " FROM PB040_NG_Count " + # 这里补充了空格 " WHERE read_at_2 BETWEEN '" + query_start_time + "'" + " AND CURRENT_TIMESTAMP" + " ORDER BY read_at_2 ASC")
更安全的优化建议:使用参数化查询
另外,直接拼接字符串的写法存在SQL注入风险,而且如果query_start_time的格式有异常,也容易触发新的错误。推荐改用参数化查询来改写代码:
query = """ SELECT CAST(read_at_2 AS datetime),cell,station, CAST(Color_NG AS float)/NULLIF(Total_Production,0), CAST(Angle_NG AS float)/NULLIF(Total_Production,0), CAST(ID_NG AS float)/NULLIF(Total_Production,0), CAST(OD_NG AS float)/NULLIF(Total_Production,0), CAST(Height_NG AS float)/NULLIF(Total_Production,0) FROM PB040_NG_Count WHERE read_at_2 BETWEEN ? AND CURRENT_TIMESTAMP ORDER BY read_at_2 ASC """ cursor.execute(query, (query_start_time,))
这种写法既彻底避免了拼接时的语法失误,也提升了代码的安全性和可读性。
内容的提问来源于stack exchange,提问作者brandysriruk
相关产品推荐
相关产品推荐

