2017-10-10 64 views
0

我有一个长期存在的SQL查询,在Python中运行得很好,进入数据框 但我有数百个,所以我尝试创建一个函数来读取我的文件和执行它们。 SQL语句是这样的:阅读并执行到熊猫数据框的SQL查询

"SELECT IIf(Left([Milestone_Next_Expected],4)='Proc',1, \ 
....\ 
120 lines 
....\ 
dbo.MY_data_value" 

这是函数

def Execute_SQL_from_a_File(filename,home,conn1): 
    FORMAT1 = '%Y%m%d%H%M' 
    fd = open(filename, 'r') 
    sqlFile = fd.read() 
    fd.close() 
    KIC53 = pd.read_sql(sqlFile, conn1) 
    f_out = home + out1 + ".xls" 
    writer = pd.ExcelWriter(f_out) 
    KIC53.to_excel(writer,f_out) 
    writer.save() 

这就是调用该函数:当我运行的功能,我收到这个查询

Execute_SQL_from_a_File(QRYHOME + "qryBook" + str(BNUM) + "_" + str(IND) + ".sql", BNUM, home, conn1) 

错误:

: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The 
identifier that starts with 'SELECT 
IIf(Left([Milestone_Next_Expected],4)='Proc',1, 
\\\nIIf(Left([Milestone_Next_Expected],4)='Subm',2, 
\\\nIIf(Left([Milestone_N' is too long. Maximum length is 128.") 

我无法弄清楚,为什么我得到的长度误差,因为我可以运行相同的查询,通过创建SQLFILE作为一个长字符串:

"SELECT IIf(Left([Milestone_Next_Expected],4)='Proc',1, \ 
....\ 
120 lines 
....\ 
dbo.MY_data_value" 

任何帮助将不胜感激!

+0

你有,在有超过128字符列名?从Milestone_N开始 –

+0

您可以发布那个有问题的查询部分吗?你省略了大部分的SQL。由于您正在循环,也许*数百*文件之一有语法错误。尝试在函数中打印*文件名*,以便知道哪一个需要进行故障排除。然后打开它并检查。我怀疑它可以独立运行。 – Parfait

+0

1.列名都不是> 32 2.所有查询都在同一个地方中断,所以我相当肯定它是以查询的方式读取的。 3.所有查询在硬编码为python时运行正常 4.以下是128行查询的前六行: “SELECT IIf(Left([Milestone_Next_Expected],4)='Proc',1,\ IIf(Left([Milestone_Next_Expected],4)='Subm',2,\ IIf(Left([Milestone_Next_Expected],4)='Cond',3,\ IIf Resu',4,\ IIf(Left([Milestone_Next_Expected],4)='Fund',9,0))))))))AS [DELETE- sortby] –

回答

0

正确的方法是:1。 SQL脚本脚本不需要任何续行符号,“\” ,不需要加引号被包裹 2.读取输入文件的正确方法是:

file=open(filename,'r') 
SQLfile = s = " ".join(file.readlines()) 

现在,当被执行的代码,通过pd.read_sql_query(SQLFILE,conn1的) 没有错误