Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL Server临时表在pyodbc代码中不可用_Python_Sql_Sql Server_Database Connection_Pyodbc - Fatal编程技术网

Python SQL Server临时表在pyodbc代码中不可用

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

我正在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.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语句的连接。

您是否也了解了为什么全局临时表可以工作而本地临时表不能工作?我也有一个类似的问题,我必须创建多个临时表。第一个临时表起作用,但随后的临时表不起作用。使用您创建全局临时表的方法做了一个技巧。如果这是真的,那么应该有一些解释来解释为什么会这样。