Python SQL Server临时表在pyodbc代码中不可用
我正在python中运行一系列复杂的sql查询,其中涉及临时表。我的自动提交方法似乎无法从临时表中检索数据。下面是我使用的代码片段,这是我得到的输出:Python SQL Server临时表在pyodbc代码中不可用,python,sql,sql-server,database-connection,pyodbc,Python,Sql,Sql Server,Database Connection,Pyodbc,我正在python中运行一系列复杂的sql查询,其中涉及临时表。我的自动提交方法似乎无法从临时表中检索数据。下面是我使用的代码片段,这是我得到的输出: testQuery=""" Select top 10 * INTO #Temp1 FROM Table1 t1 JOIN Table2 t2 on t1.key=t2.key """ cnxn=pyodbc.connect(r'DRIVER={SQL Server Native Client 11
testQuery="""
Select top 10 *
INTO #Temp1
FROM Table1 t1
JOIN Table2 t2
on t1.key=t2.key
"""
cnxn=pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=server;DATABASE=DB;UID=UID;PWD=PWD')
cnxn.autocommit=True
cursor=cnxn.cursor()
cursor.execute(testQuery)
cursor.execute("""Select top 10 * from #Temp1""")
<pyodbc.Cursor at 0x8f78930>
cnxn=pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=server;DATABASE=DB;UID=UID;PWD=PWD')
cnxn.autocommit=True
cursor=cnxn.cursor()
cursor.execute(testQuery)
cursor.execute("""Select top 10 * from #Temp1""")
我向一位同事询问了这件事,他的建议奏效了。所以我改变了testQuery,创建了一个全局临时表,而不是本地临时表,而不是临时表。然后转到sql server测试临时表是否确实在创建。所以我发现问题出在第二个cursor.execute语句上。我修改了代码,改为使用pandas-read\u-sql\u-query,结果一切顺利!下面是我使用的代码:
testQuery="""
Select top 10 *
INTO ##Temp1
FROM Table1 t1
JOIN Table2 t2
on t1.key=t2.key
"""
cnxn=pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=server;DATABASE=DB;UID=UID;PWD=PWD')
cnxn.autocommit=True
cursor=cnxn.cursor()
cursor.execute(testQuery)
cnxn.commit()
query1="Select top 10 * from ##Temp1"
data1=pd.read_sql_query(query1, cnxn)
data1[:10]
最好的方法是从以下内容开始SQL查询: 不计较
这将输出所需的数据即使这个问题有解决方案,即使用全局临时表而不是本地临时表,未来的读者可能会从理解问题发生的原因中获益 当使用临时表的最后一个连接关闭时,临时表将自动删除。本地临时表Temp1和全局临时表Temp1之间的区别在于,本地临时表仅对创建它的连接可见,而现有全局临时表对任何连接都可用 因此,以下使用本地临时表的代码将失败 conn=pyodbc.connectconn_str,autocommit=True crsr=连接光标 sql=\ 选择1作为foo,选择2作为Temp1中的bar crsr.executesql conn=pyodbc.connectconn_str,autocommit=True crsr=连接光标 sql=\ 从Temp1中选择foo、bar crsr.executesql 行=crsr.fetchone 打印行 。。。虽然使用全局临时表的完全相同的代码将成功 conn=pyodbc.connectconn_str,autocommit=True crsr=连接光标 sql=\ 选择1作为foo,选择2作为Temp1中的bar crsr.executesql conn=pyodbc.connectconn_str,autocommit=True crsr=连接光标 sql=\ 从Temp1中选择foo、bar crsr.executesql 行=crsr.fetchone 打印行 。。。因为第二个pyodbc.connect调用会打开到SQL Server的另一个连接,而不会关闭第一个连接 第二个连接无法看到由第一个连接创建的本地临时表。请注意,本地临时表仍然存在,因为第一个连接从未关闭,但第二个连接无法看到它 但是,第二个连接可以看到全局临时表,因为第一个连接从未关闭,因此全局临时表仍然存在
这种类型的行为会影响到ORM和其他机制,这些机制可能会隐式地打开和关闭服务器与它执行的每个SQL语句的连接。您是否也了解了为什么全局临时表可以工作而本地临时表不能工作?我也有一个类似的问题,我必须创建多个临时表。第一个临时表起作用,但随后的临时表不起作用。使用您创建全局临时表的方法做了一个技巧。如果这是真的,那么应该有一些解释来解释为什么会这样。