Python PYODBC - 以前的SQL不是查询

时间:2016-12-03 17:23:10

标签: python sql

我有以下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。我还将查询放在它自己的独立文件中,没有循环来遍历文件,以防这导致问题没有成功。

1 个答案:

答案 0 :(得分: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()