我正在尝试自动执行一系列查询。一个查询,比如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()
语句中创建易失性表。关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
您已在BT / ET模式下连接。执行Q1查询后,执行“ET”命令以结束事务。
或者您可以在Teradata默认模式下连接以自动提交查询。
答案 1 :(得分:0)
您必须在两个单独的请求中发送创建和选择。
在ANSI会话中,您必须在提交保留行之后的之后添加 COMMIT; ;
要从ANSI切换到Teradata会话,您需要更改为会话模式= Teradata;
如果您处于Teradata模式会话中,则不需要BT / ET,因为每个请求都是隐式事务。