Sql 用volatile表在VBA中进行TeraData查询

Sql 用volatile表在VBA中进行TeraData查询,sql,vba,teradata,volatile,recordset,Sql,Vba,Teradata,Volatile,Recordset,我正在尝试自动执行一系列查询。一个查询,比如Q1,是有问题的,因为它在select语句之前创建了一个易失性表。在TeraData中,Q1运行正常,但通过VBA将Q1传递给TeraData时,我得到一个错误: 只有ET或null语句在DDL语句之后才是合法的 Q1的形式如下: create multiset volatile table volatileTable, no fallback, no before journal, no after journal,

我正在尝试自动执行一系列查询。一个查询,比如Q1,是有问题的,因为它在select语句之前创建了一个易失性表。在TeraData中,Q1运行正常,但通过VBA将Q1传递给TeraData时,我得到一个错误:

只有ET或null语句在DDL语句之后才是合法的

Q1的形式如下:

    create multiset volatile table volatileTable,
    no fallback,
    no before journal,
    no after journal,
    (
        a1,
        a2,
        a3,
        a4,
        a5
    ) as 
    (sel
        b1,
        b2,
        b3,
        min(b4) as a1,
        min(b5) as a2
    from
        db.table
    where
        b6 = 'condition'
    group by
        b1,
        b2,
        b3
    )
    with data
    on commit preserve rows;

    sel
        c1,
        c2,
        c3
    from 
        db.table
    group by
        1,
        2

    union

    sel
        d1,
        d2,
        d3
    from 
        (sel
            e.f1,
            e.f2,
            e.f3,
            e.a1,
            s.a1,
            e.a2,
            s.a2,
            e.a3,
            s.a3,
            e.a4,
            s.a4,
            e.a5,
            s.a5
        from 
            db.table) as e
            left outer join volatileTable as s
            on
                e.a1 = s.a1
                e.a2 = s.a2
                e.a3 = s.a3
                e.a4 >= s.a4
                e.a5 <= s.a5    
    group by
        1,
        2

    union

    sel
        g1,
        g2,
        g3
    from 
        db.table
    group by
        1,
        2

    union

    ...
create multiset volatile table volatile,
没有退路,
不,在日记之前,
不,在日记之后,
(
a1,
a2,
a3,
a4,
a5
)作为
(sel
b1,
b2,
b3,
最小值(b4)为a1,
最小值(b5)为a2
从…起
数据库表
哪里
b6=‘条件’
分组
b1,
b2,
b3
)
有数据
在提交保存行上;
选择
c1,
c2,
c3
从…起
数据库表
分组
1.
2.
联盟
选择
d1,
d2,
d3
从…起
(sel
e、 f1,
e、 f2,
e、 f3,
e、 a1,
s、 a1,
e、 a2,
s、 a2,
e、 a3,
s、 a3,
e、 a4,
s、 a4,
e、 a5,
s、 a5
从…起
db.table)作为e
左外连接可挥发为s
在…上
e、 a1=s.a1
e、 a2=s.a2
e、 a3=s.a3
e、 a4>=s.a4

e、 a5您以BT/ET模式连接。执行Q1查询后,执行“ET”命令以结束事务


或者,您可以在Teradata默认模式下进行连接以自动提交查询。

您必须在两个单独的请求中发送创建和选择

在ANSI会话中,必须添加提交在提交后创建保留行

要从ANSI切换到Teradata会话,您需要切换到会话模式=Teradata


如果您使用的是Teradata模式会话,则不需要BT/ET,因为每个请求都是隐式事务。

我已尝试在BT和ET中包装Q1。我还尝试在BT和ET中包装create VOLIATE语句。这两种模式都会给我原帖中描述的错误。如何选择通过VBA连接Teradata的模式?我当前的VBA连接读取
connection.Open“数据源=environment;数据库=db;持久安全信息=True;用户ID=UID;密码=PW;会话模式=ANSI;”
对,我想是的。但问题仍然存在:为什么在DDL错误后我会得到no DML?如何在一个Teradata会话中发送两个单独的请求?现在,我有一个执行行读取
recordSet=cmdSQL.execute()
。请原谅,我只是在学习如何通过VBA访问Teradata。在上面的评论中:
cmdSQL.CommandText=queryFromFile
queryFromFile
作为字符串和
cmdSQL.commandType=adCmdText
。必须有两个单独的执行请求,一个用于
创建为…
,另一个用于
选择