【问题标题】:pypyodbc error Invalid object name for a temp tablepypyodbc 错误临时表的对象名称无效
【发布时间】:2019-03-09 21:51:40
【问题描述】:

收到错误 pypyodbc.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '#responses_to_dedupe'.") 当试图查询临时表。我的实际查询要复杂一些,但这是得到相同结果的简化版本:

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()中的第一个,所以我假设它创建表就好了。)

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

我也尝试了两者之间的 c.commit() 语句,但结果相同。

【问题讨论】:

  • 我不了解 Python,但是,临时表仅在创建它的连接期间持续存在。查看您的代码示例,我猜这是 2 个单独的连接,因此在运行第二个命令时该表不存在。

标签: sql-server python-3.x pypyodbc


【解决方案1】:

就 sql 而言,@user3469050 的评论是正确的。您应该能够将两个语句放入一个执行语句中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2010-11-18
    • 2020-08-07
    相关资源
    最近更新 更多