2016-12-03 40 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