我有以下python代码,它逐行读取文本文件,并将每行的字符x到y作为变量" Contract"。
import os
import pyodbc
cnxn = pyodbc.connect(r'DRIVER={SQL Server};CENSORED;Trusted_Connection=yes;')
cursor = cnxn.cursor()
claimsfile = open('claims.txt','r')
for line in claimsfile:
#ldata = claimsfile.readline()
contract = line[18:26]
print(contract)
cursor.execute("USE calms SELECT XREF_PLAN_CODE FROM calms_schema.APP_QUOTE WHERE APPLICATION_ID = "+str(contract))
print(cursor.fetchall())
当包含line cursor.fetchall()时,会返回以下错误:
编程错误:以前的SQL不是查询。
查询在SSMS中运行并将str(contract)替换为变量结果的实际值将按预期返回。
根据数据,查询将返回一个值,格式为NVARCHAR(4)。
大多数其他示例都有在循环之前声明的变量,建议的解决方案是设置NO COUNT,这不适用于我的问题所以我有点迷失。
P.S。我还将查询放在它自己的独立文件中,没有循环来遍历文件,以防这导致问题没有成功。
答案 0 :(得分:1)
在SQL查询中,您实际上是在发出两个命令:USE
和SELECT
,并且游标未设置多个语句。另外,对于数据库连接,您应该在连接字符串中选择数据库模式(即DATABASE
参数),因此不需要TSQL USE
。
使用参数化考虑以下调整,其中APPLICATION_ID
假定为整数类型。根据需要添加凭据:
constr = 'DRIVER={SQL Server};SERVER=CENSORED;Trusted_Connection=yes;' \
'DATABASE=calms;UID=username;PWD=password'
cnxn = pyodbc.connect(constr)
cur = cnxn.cursor()
with open('claims.txt','r') as f:
for line in f:
contract = line[18:26]
print(contract)
# EXECUTE QUERY
cur.execute("SELECT XREF_PLAN_CODE FROM APP_QUOTE WHERE APPLICATION_ID = ?",
[int(contract)])
# FETCH ROWS ITERATIVELY
for row in cur.fetchall():
print(row)
cur.close()
cnxn.close()