带有volatile表的VBA中的TeraData查询

时间:2014-07-25 17:57:25

标签: sql vba teradata volatile recordset

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

  

在DDL声明之后,只有ET或null语句才合法。

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

    ...

问题在于在VBA ADODB.Command.Execute()语句中创建易失性表。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

在ANSI会话中,您必须在提交保留行之后的之后添加 COMMIT; ;

要从ANSI切换到Teradata会话,您需要更改为会话模式= Teradata;

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