Несмотря на то, что этот вопрос имеет «решение», то есть, используя глобальную таблицу темп вместо локальной таблицы темп, будущие читатели могут извлечь выгоду из понимания того, почему проблема произошла в первую очередь.
Временная таблица автоматически отбрасывается, когда последнее соединение, использующее указанную таблицу, закрывается. Разница между локальной таблицей temp (#Temp1
) и глобальной временной таблицей (##Temp1
) заключается в том, что локальная таблица темпа видна только для соединения, которое ее создало, а существующая глобальная таблица темп доступна для любого соединения.
Таким образом, следующий код используется локальная таблица температуры не даст ...
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)
... в то время как тот же самый код, используя глобальную временную таблицу преуспеет ...
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)
... потому что второй вызов pyodbc.connect
открывает отдельное второе подключение к SQL Server без закрытия первого.
Второе соединение не может видеть локальную таблицу темп, создаваемую первым соединением. Обратите внимание, что локальная таблица temp все еще существует, потому что первое соединение никогда не было закрыто, но второе соединение не может его увидеть.
Однако второе соединение может видеть глобальную таблицу темп, поскольку первое соединение никогда не было закрыто, и поэтому глобальная таблица темпов продолжала существовать.
Этот тип поведения имеет последствия для ORM и других механизмов, которые могут неявно открывать и закрывать соединения с сервером для каждого выполняемого им оператора SQL.
Вы также выяснили, почему глобальные таблицы temp работают, а локальные - нет? У меня также была аналогичная проблема, когда мне приходилось создавать несколько временных таблиц. Первая рабочая таблица работала, но в последующих не было. Использование метода создания глобальных временных таблиц сделало трюк – Alex