pypyodbc错误临时表的对象名称无效

时间:2019-03-09 21:51:40

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

收到错误 pypyodbc.ProgrammingError :('42S02',“ [42S02] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名称'#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()语句,但结果相同。

1 个答案:

答案 0 :(得分:1)

@ user3469050对sql的注释是正确的。您应该能够将两个语句放入一个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