如何在SQL Server查询字符串中有效使用%s占位符(Python+pymssql)
解决pymssql参数化查询返回空结果的问题
你的问题出在手动拼接SQL字符串和错误处理占位符引号上,pymssql配合pandas的read_sql时,必须用参数化查询的正确方式,不能直接用字符串格式化%拼接。
正确实现步骤:
- 移除
job_id = '%s'中的单引号,参数化查询会自动根据数据类型处理引号和转义 - 不要直接拼接SQL字符串,改用
read_sql的params参数传递变量 - 确保参数顺序和SQL中
%s的顺序完全对应
修正后的代码:
import pandas as pd import pymssql import datetime import time import requests def liststeps(date1, jobid): sqlquery = """ select stepi, stepn, pckg, runst, rundur from src_table where run_date = %s and job_id = %s """ # 通过params传递参数,pymssql自动处理类型和引号 df = pd.read_sql(sqlquery, conn, params=(date1, jobid)) print(df)
为什么之前的方式会出问题:
- 字符串拼接导致的参数格式错误:手动给
%s加单引号后,若jobid包含特殊字符(如单引号),会导致SQL语法错误,或者生成的job_id值与数据库存储的格式不匹配,从而返回空结果 - 类型不匹配:直接用
%拼接时,date1可能被转换成不符合SQL Server要求的字符串格式,而参数化查询会保留原始数据类型,确保日期参数被正确解析
额外注意:
- 确保
conn是已正确建立的pymssql连接对象 - 如果
date1是Python的datetime对象,参数化查询会自动转换成SQL Server可识别的日期类型,无需手动格式化字符串
内容的提问来源于stack exchange,提问作者eagle17
相关产品推荐
相关产品推荐

