首页 > 解决方案 > Python打开替换以传递用于在SQL中创建表的变量导致错误“DDL之后只有ET或Null语句合法”

问题描述

我正在尝试将变量传递到多个 Teradata SQL 文件中。当我在文件中没有“创建表”时,我有几个脚本可以完美地执行此操作。当我使用硬编码的变量运行文件时,它们运行得很好,但是当我使用打开/替换函数时,我收到错误“在 ddl 语句之后只有 et 或 null 语句是合法的”。

这告诉我“Open().Replace()”函数是造成这种情况的原因。这似乎导致python并行而不是串行运行SQL脚本,但我不知道如何解释这一点。我尝试在执行光标之外使用打开/替换,但由于变量未更改而出错。我在下面有一些代码示例,这些示例针对这个问题进行了简化。这是我第一次发布问题,所以如果有更好的方法让我这样做,请随时发表评论,以便我进行编辑。

没有变量的 test.sql

create multiset volatile table sdates as (Sel caldt, datesk
                                           from dimdates
                                           where day = 'Mon'
                                           and mth = 'Feb');

ins into vartest (Sel caldt, site, sum(sales)
                  from fctsales f
                  join sdates s
                  on f.datesk = s.datesk);

有效的python代码

query = cur.execute(file = 'test.sql')

带有变量的 test.sql

create multiset volatile table sdates as (Sel caldt, datesk
                                           from dimdates
                                           where day = 'bbbb'
                                           and mth = 'oooo');

ins into vartest (Sel caldt, site, sum(sales)
                  from fctsales f
                  join sdates s
                  on f.datesk = s.datesk);

失败的python代码

bbbb = 'Mon'
oooo = 'Feb'


query = cur.execute(open(file = 'test.sql').read().replace('bbbb',bbbb).replace('oooo',oooo))



DatabaseError: (3932, '[25000] [Teradata][ODBC Teradata Driver][Teradata Database](-3932)Only an ET or null statement is legal after a DDL Statement.')

编辑 1:添加了确切的错误代码

标签: pythonsqlfilevariablesteradata

解决方案


推荐阅读