Python连接SQL Server:基于无前缀LOAN_ID列表查询表行
解决Python查询SQL Server匹配批量贷款ID的问题
方法1:固定前缀长度下直接提取后缀匹配
因为LOAN_ID格式是四位数字_实际贷款ID,前缀(四位数字+下划线)长度固定为5位,直接用SUBSTRING提取后缀,效率最高。Python端把目标ID列表转成参数化查询的占位符,避免SQL注入。
示例代码:
import pyodbc # 你的无前缀贷款ID列表 target_ids = ["LX3333", "LX4444", ...] # 约1000条 # 建立数据库连接 conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=你的服务器地址;' 'DATABASE=你的数据库名;' 'UID=用户名;' 'PWD=密码' ) cursor = conn.cursor() # 生成对应数量的参数占位符 placeholders = ','.join(['?'] * len(target_ids)) # 编写查询语句,提取LOAN_ID第6位及以后的部分做匹配 query = f""" SELECT deal_name, LOAN_ID FROM 你的表名 WHERE SUBSTRING(LOAN_ID, 6, LEN(LOAN_ID)) IN ({placeholders}) """ # 执行参数化查询 cursor.execute(query, target_ids) results = cursor.fetchall() # 处理查询结果 for row in results: print(row.deal_name, row.LOAN_ID) # 关闭连接 cursor.close() conn.close()
方法2:前缀长度不固定时用字符定位提取后缀
如果前缀的数字位数可能有变动,用CHARINDEX定位下划线位置,再提取后面的部分:
修改查询语句即可:
WHERE RIGHT(LOAN_ID, LEN(LOAN_ID) - CHARINDEX('_', LOAN_ID)) IN ({placeholders})
其余Python代码和方法1一致。
方法3:批量插入临时表再关联查询(适合超大量ID)
如果后续ID数量超过SQL Server的参数限制(默认2100个),可以先把目标ID插入临时表,再用JOIN关联查询:
示例代码:
import pyodbc target_ids = ["LX3333", "LX4444", ...] conn = pyodbc.connect(你的连接字符串) cursor = conn.cursor() # 创建临时表 cursor.execute("CREATE TABLE #TempLoanIDs (LoanID VARCHAR(50))") # 批量插入目标ID cursor.executemany("INSERT INTO #TempLoanIDs (LoanID) VALUES (?)", [(id,) for id in target_ids]) # 关联查询 query = """ SELECT t.deal_name, t.LOAN_ID FROM 你的表名 t JOIN #TempLoanIDs tmp ON RIGHT(t.LOAN_ID, LEN(t.LOAN_ID) - CHARINDEX('_', t.LOAN_ID)) = tmp.LoanID """ cursor.execute(query) results = cursor.fetchall() # 清理临时表并关闭连接 cursor.execute("DROP TABLE #TempLoanIDs") cursor.close() conn.close()
注意事项
- 如果贷款ID包含单引号,参数化查询会自动处理转义,比直接拼接字符串更安全
- 频繁查询时,可给LOAN_ID的后缀部分创建计算列并添加索引,大幅提升查询速度
- 1000条ID的IN查询完全符合SQL Server的参数限制,无需担心报错
内容的提问来源于stack exchange,提问作者themellion
相关产品推荐
相关产品推荐

