"TypeError: 'NoneType' object is not iterable" from pandas read_sql
"TypeError: 'NoneType' object is not iterable" from pandas read_sql
我正尝试在 python 中使用 pyodbc 运行 SQL 命令。
其中 SQL 命令包含多个 SELECT 命令和 IF 语句。
但我收到如下错误
columns = [col_desc[0] for col_desc in cursor.description]
TypeError: 'NoneType' object is not iterable
import pyodbc
import pandas as pd
conn = pyodbc.connect("DRIVER={SQL Server};"
"SERVER=server_name;"
"DATABASE=master;"
"Trusted_Connection=yes;")
cursor = conn.cursor()
script="""
If object_id ('tempdb..#Temp1')is not null
drop table #Temp1
Select distinct a1.some_ID into #Temp1
from DOC.dbo.Document_tbl (NOLOCK)a1
from #Temp1 a1
If object_id ('tempdb..#Temp2')is not null
Drop table #Temp2
select distinct v2.some_data
into #Temp2 from tbl_name (nolock) v2
If object_id ('tempdb..#Results')is not null
drop table #Results
select distinct a1.*,b1.####
into #Results
from #Temp1 a1
left join #Temp2 b1 on a1.## = b1.##
Select * from #Results
"""
df = pd.read_sql(script, cnxn)
writer = pd.ExcelWriter('result.xlsx')
df.to_excel(writer, sheet_name ='bar')
writer.save()
SQL 包含多个 SQL 语句的命令文本称为 匿名代码块 。一个匿名代码块可以 return 多个结果,其中每个结果可以是
- 行计数,
- 包含零行或多行数据的结果集,或者
- 一个错误。
以下示例失败...
sql = """\
SELECT 1 AS foo INTO #tmp;
SELECT * FROM #tmp;
"""
df = pd.read_sql_query(sql, cnxn)
# TypeError: 'NoneType' object is not iterable
... 因为第一个 SELECT ... INTO
return 是行计数,第二个 SELECT
return 是其结果集。
修复方法是使用 SET NOCOUNT ON;
启动匿名代码块,这会抑制行数并且只有 return 结果集:
sql = """\
SET NOCOUNT ON;
SELECT 1 AS foo INTO #tmp;
SELECT * FROM #tmp;
"""
df = pd.read_sql_query(sql, cnxn)
# no error
对于仍然出现此错误的任何其他人,我发现对于某些语句(聚合空值的 window 函数)我还需要包含 SET ANSI_WARNINGS OFF;
.
我正尝试在 python 中使用 pyodbc 运行 SQL 命令。 其中 SQL 命令包含多个 SELECT 命令和 IF 语句。
但我收到如下错误
columns = [col_desc[0] for col_desc in cursor.description]
TypeError: 'NoneType' object is not iterable
import pyodbc
import pandas as pd
conn = pyodbc.connect("DRIVER={SQL Server};"
"SERVER=server_name;"
"DATABASE=master;"
"Trusted_Connection=yes;")
cursor = conn.cursor()
script="""
If object_id ('tempdb..#Temp1')is not null
drop table #Temp1
Select distinct a1.some_ID into #Temp1
from DOC.dbo.Document_tbl (NOLOCK)a1
from #Temp1 a1
If object_id ('tempdb..#Temp2')is not null
Drop table #Temp2
select distinct v2.some_data
into #Temp2 from tbl_name (nolock) v2
If object_id ('tempdb..#Results')is not null
drop table #Results
select distinct a1.*,b1.####
into #Results
from #Temp1 a1
left join #Temp2 b1 on a1.## = b1.##
Select * from #Results
"""
df = pd.read_sql(script, cnxn)
writer = pd.ExcelWriter('result.xlsx')
df.to_excel(writer, sheet_name ='bar')
writer.save()
SQL 包含多个 SQL 语句的命令文本称为 匿名代码块 。一个匿名代码块可以 return 多个结果,其中每个结果可以是
- 行计数,
- 包含零行或多行数据的结果集,或者
- 一个错误。
以下示例失败...
sql = """\
SELECT 1 AS foo INTO #tmp;
SELECT * FROM #tmp;
"""
df = pd.read_sql_query(sql, cnxn)
# TypeError: 'NoneType' object is not iterable
... 因为第一个 SELECT ... INTO
return 是行计数,第二个 SELECT
return 是其结果集。
修复方法是使用 SET NOCOUNT ON;
启动匿名代码块,这会抑制行数并且只有 return 结果集:
sql = """\
SET NOCOUNT ON;
SELECT 1 AS foo INTO #tmp;
SELECT * FROM #tmp;
"""
df = pd.read_sql_query(sql, cnxn)
# no error
对于仍然出现此错误的任何其他人,我发现对于某些语句(聚合空值的 window 函数)我还需要包含 SET ANSI_WARNINGS OFF;
.