是否可以在使用挥发表的Excel中运行Teradata查询?

时间:2019-05-21 22:03:23

标签: teradata

我的Teradata查询创建一个volatile,用于联接到现有视图。将查询链接到excel时,会弹出以下错误:“ Teradata:[Teradata数据库] [3932]在DDL语句之后,只有ET或null语句是合法的”。对于在teradata中没有写权限来创建真实视图或表的人,是否有针对性的解决方法?我想避免在SQL中链接到Teradata并运行一个开放式查询以提取所需的数据。

这是用于Excel 2016 64位并使用Teradata版本15.10.1.12

1 个答案:

答案 0 :(得分:0)

通常,如果您使用ANSI模式或以BTET模式发行了BT(开始交易),则会发生此错误。

以下是一些解决方法:

  1. 在创建易失表语句之后发出ET;语句(落实)。如果您使用的是ANSI模式,请使用COMMIT;而不是ET;。如果不确定,请依次尝试每个。只有一个有效,但是两者都做相同的事情。确保您的挥发表包含ON COMMIT PRESERVE ROWS
  2. 在建立会话时,请尝试使用BT ET模式(也称为Teradata模式)。我不记得在哪里,但是在ODBC配置中会为此设置。
  3. 尝试使用全局临时表。这些操作与易失性表类似,外,您只需定义一次并保留其定义。也就是说,您可以在BTEQ或SQL助手等中创建它。该定义对于所有用户和会话(即Excel会话)通用,但是内容是短暂的,并且对于每个会话都是唯一的(例如易失性表)。
  4. 将插入内容的选择部分移入易失性表中,以从易失性表中选择数据的查询。参见下面的简单示例。

如果您没有创建全局临时表的权限,请询问您的DBA。

这是一个简单的例子来说明第4点。

当前:

create volatile table tmp (id Integer)
ON COMMIT PRESERVE ROWS;

insert into tmp
select customer_number
from customer
where X = Y and yr = 2019
;

select a,b,c
from another_tbl A join TMP T ON
    A.id = T.id
;

成为:

select a,b,c
from another_tbl A join (
        select customer_number
        from customer
        where X = Y and yr = 2019
        ) AS T
    ON
      A.id = T.id
;

或者更好的是,直接将表连接起来。

注意:第一个序列(创建表,插入并选择)是一个三个语句系列。这将返回3个“结果集”。前两个将是行计数,最后一个将是实际数据。大多数程序(包括我认为Excel)不能处理多个结果集响应。这就是很难将Teradata宏与Excel等客户端工具一起使用的原因之一。

后一种解决方案(单选)避免了这个潜在问题。