Auch wenn diese Frage eine "Lösung" hat, dh eine globale temporäre Tabelle anstelle einer lokalen temporären Tabelle verwendet, könnten zukünftige Leser davon profitieren, zu verstehen, warum das Problem überhaupt aufgetreten ist.
Eine temporäre Tabelle wird automatisch gelöscht, wenn die letzte Verbindung, die diese Tabelle verwendet, geschlossen wird. Der Unterschied zwischen einer lokalen temporären Tabelle (#Temp1
) und einer globalen temporären Tabelle (##Temp1
) besteht darin, dass die lokale temporäre Tabelle nur für die Verbindung sichtbar ist, die sie erstellt hat, während eine vorhandene globale temporäre Tabelle für jede Verbindung verfügbar ist.
So ist der folgende Code eine lokale temporäre Tabelle verwendet, wird fehlschlagen ...
conn = pyodbc.connect(conn_str, autocommit=True)
crsr = conn.cursor()
sql = """\
SELECT 1 AS foo, 2 AS bar INTO #Temp1
"""
crsr.execute(sql)
conn = pyodbc.connect(conn_str, autocommit=True)
crsr = conn.cursor()
sql = """\
SELECT foo, bar FROM #Temp1
"""
crsr.execute(sql)
row = crsr.fetchone()
print(row)
... während die exakt gleichen Code eine globale temporäre Tabelle mit gelingen wird ...
conn = pyodbc.connect(conn_str, autocommit=True)
crsr = conn.cursor()
sql = """\
SELECT 1 AS foo, 2 AS bar INTO ##Temp1
"""
crsr.execute(sql)
conn = pyodbc.connect(conn_str, autocommit=True)
crsr = conn.cursor()
sql = """\
SELECT foo, bar FROM ##Temp1
"""
crsr.execute(sql)
row = crsr.fetchone()
print(row)
... weil der zweite Aufruf pyodbc.connect
eine separate zweite Verbindung zum SQL Server öffnet, ohne den ersten zu schließen.
Die zweite Verbindung kann die lokale temporäre Tabelle, die von der ersten Verbindung erstellt wird, nicht sehen. Beachten Sie, dass die lokale temporäre Tabelle weiterhin vorhanden ist, da die erste Verbindung nie geschlossen wurde, die zweite Verbindung jedoch nicht.
Die zweite Verbindung kann jedoch die globale temporäre Tabelle anzeigen, da die erste Verbindung nie geschlossen wurde und daher die globale temporäre Tabelle weiterhin vorhanden ist.
Dieser Verhaltenstyp hat Auswirkungen auf ORMs und andere Mechanismen, die Verbindungen zu dem Server für jede SQL-Anweisung, die er ausführt, implizit öffnen und schließen können.
Haben Sie auch herausgefunden, warum globale temporäre Tabellen funktionieren, während lokale nicht funktionieren? Ich hatte auch ein ähnliches Problem, wo ich mehrere temporäre Tabellen erstellen musste. Die erste Temp-Tabelle funktionierte, die nachfolgenden jedoch nicht. Die Verwendung der Methode zum Erstellen von globalen temporären Tabellen hat sich bewährt – Alex