在python中使用临时表执行MS sql查询序列

时间:2017-12-06 21:47:38

标签: python sql-server pandas pyodbc

目前正在尝试使用product_typepyodbc来读取sql查询序列(来自pandas)并检查为数据帧,在序列中的第一个查询中收到以下错误:

MS sql server

相关的代码段如下:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-95-5eec1638614b> in <module>()
    285 for count, q in enumerate(sql_in):
    286     print count
--> 287     frame_in = pd.read_sql(q, cnxn)
    288 print frame_in.head(n=10)
    289 

/home/mapr/anaconda2/lib/python2.7/site-packages/pandas/io/sql.pyc in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)
    497             sql, index_col=index_col, params=params,
    498             coerce_float=coerce_float, parse_dates=parse_dates,
--> 499             chunksize=chunksize)
    500 
    501     try:

/home/mapr/anaconda2/lib/python2.7/site-packages/pandas/io/sql.pyc in read_query(self, sql, index_col, coerce_float, params, parse_dates, chunksize)
   1598         args = _convert_params(sql, params)
   1599         cursor = self.execute(*args)
-> 1600         columns = [col_desc[0] for col_desc in cursor.description]
   1601 
   1602         if chunksize is not None:

TypeError: 'NoneType' object is not iterable

以这种方式完成,因为只对最终临时表感兴趣(使用sql_in = """ SET NOCOUNT ON; select <stuff> from <table1> into #<temptable1> ----SPLIT SET NOCOUNT ON; select <stuff> from <table2> into #<temptable2> ----SPLIT SET NOCOUNT ON; select <stuff> from <table3> into #<temptable3> ----SPLIT SET NOCOUNT ON; select <stuff> from <table4> <joined with temptables1-3> into #<temptable4> """.split('----SPLIT') for count, q in enumerate(sql_in): print count frame_in = pd.read_sql(q, cnxn) ,因为发布了here的建议。)

可以通过运行确认pyodbc已正确配置:

split

实际上是获取服务器版本。

任何想法为什么会发生这种情况以及如何解决?感谢。

1 个答案:

答案 0 :(得分:1)

我相信这是因为前几个查询不返回任何数据。 Pandas read_sql期望数据回来。您应该只使用pyodbc执行函数来运行这些查询。