Для тех, кто сталкивался с этим вопросом и, возможно, сталкивался с подобными проблемами, я подумал, что передам то, что узнал со времени публикации. Оказывается, вы можете использовать временные таблицы в pymssql
, но вы должны быть очень осторожны в обработке коммитов.
Сначала я объясню на примере. Будет работать следующий код:
testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )
INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)
"""
conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
cur.execute("SELECT * FROM #TEST")
tmp = cur.fetchone()
tmp
Это вернет первый элемент (последующий выбор вернет другой):
('Mike', 12)
Но следующее НЕ будет работать
testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )
INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)
SELECT * FROM #TEST
"""
conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
tmp = cur.fetchone()
tmp
Это не произойдет, сказав "pymssql.OperationalError: No data available.
". Причина, насколько я могу судить, заключается в том, что независимо от того, включен ли автокоммит или нет, и независимо от того, выполняете ли вы конкретный коммит самостоятельно или нет, все таблицы должны быть явно созданы И СОГЛАСОВАНЫ. прежде чем пытаться читать с них.
В первом случае вы заметите, что есть два "cur.execute(...)
" вызова. Первый создает временную таблицу. После завершения «cur.execute()
», так как автокоммит включен, скрипт SQL зафиксирован, временная таблица создана. Затем вызывается другой cur.execute()
для чтения из этой таблицы. Во втором случае я пытаюсь создавать и читать из таблицы «одновременно» (по крайней мере, в уме pymssql
... он прекрасно работает в MS SQL Server Management Studio). Поскольку таблица ранее не создавалась и не фиксировалась, я не могу запросить ее.
Ого ... это было трудно обнаружить, и мне будет сложно настроить мой код (сначала разработанный на MS SQL Server Management Studio) так, чтобы он работал внутри скрипта. Ну да ладно ...