Sql server PYODBC错误临时表的对象名称无效

Sql server PYODBC错误临时表的对象名称无效,sql-server,python-3.x,pypyodbc,Sql Server,Python 3.x,Pypyodbc,在尝试查询临时表时,接收到错误('42S02',“[42S02][Microsoft][ODBC SQL Server驱动程序][SQL Server]无效的对象名称“#响应_至_重复数据删除”。”)。我的实际查询有点复杂,但下面是一个简化版本,它得到了相同的结果: c.execute(""" SELECT ECR_ID, RespondentID, ? AS DestinationID, TEIQuestionID, DateSubmitted INTO #r

在尝试查询临时表时,接收到错误('42S02',“[42S02][Microsoft][ODBC SQL Server驱动程序][SQL Server]无效的对象名称“#响应_至_重复数据删除”。”)。我的实际查询有点复杂,但下面是一个简化版本,它得到了相同的结果:

c.execute("""
    SELECT ECR_ID, RespondentID, ? AS DestinationID, 
        TEIQuestionID, DateSubmitted
    INTO #responses_to_dedupe
    FROM ETLTEIConsumerResponses
    WHERE DoNotProcess IS NULL;
    """, [source['destinationid']])

c.execute("""
    SELECT *
    FROM #responses_to_dedupe;
    """)
(请注意,错误消息之前的回溯显示了发生在上述代码块的最后一行--“”上的错误,而不是发生在两个execute()中的第一行,因此我假设它创建的表很好。)

多年来,我一直在同一台机器/环境上的生产脚本中做着完全相同的事情,没有出现错误,甚至在这个脚本的前面创建了另一个临时表,并在没有关联的情况下访问它。这两种情况的唯一区别是临时表是使用驼峰大小写命名的——这一个我使用的是小写的un但是如果我将表名更改为#ResponsesToDedupe,仍然会得到相同的结果


我还尝试了在这两个语句之间使用c.commit()语句,但结果相同。

就sql而言@user3469050的注释是正确的。您应该能够将这两个语句放在一个execute语句中

c.execute("""
    WITH responses_to_dedupe_cte
AS
(
    SELECT ECR_ID, RespondentID, ? AS DestinationID, 
        TEIQuestionID, DateSubmitted
    FROM ETLTEIConsumerResponses
    WHERE DoNotProcess IS NULL
) 
SELECT *    FROM responses_to_dedupe_cte
""", [source['destinationid']])
否则,您可以使用全局临时表,但我通常会避开它

##responses_to_dedupe

但是,我不知道Python,临时表只在创建它的连接期间存在。查看您的代码示例,我猜这是两个独立的连接,因此在运行第二个命令时,该表不存在。