2016-12-03 58 views
0

我有以下python代码,它通过逐行读取文本文件并将每行的字符x到y作为变量“Contract”。Python PYODBC - 以前的SQL不是查询

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()) 

当包括线cursor.fetchall()时,返回以下错误:

Programming Error: Previous SQL was not a query.

查询在SSMS运行,并与可变的结果的实际值替换STR(合同)将按预期退还。

根据数据,查询将返回一个值作为格式为NVARCHAR(4)的结果。

大多数其他示例都有在循环之前声明的变量,并且建议的解决方案是设置NO COUNT,但这不适用于我的问题,因此我略有丢失。

P.S.我也将查询放在它自己的独立文件中,没有循环来遍历文件,以免导致问题而没有成功。

回答

1

在您的SQL查询中,您实际上是在制作两个命令:USESELECT,并且游标未设置多条语句。此外,通过数据库连接,您应该选择连接字符串中的数据库模式(即参数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() 
+0

您绝对正确,谢谢:) –

+0

太棒了!如果这有帮助,请接受答案(勾选标记到旁边)以确认解决方案。 – Parfait