【问题标题】:Is it possible to run a Teradata query in Excel that uses Volatile tables?是否可以在使用易失性表的 Excel 中运行 Teradata 查询?
【发布时间】:2019-10-08 08:33:08
【问题描述】:

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

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

【问题讨论】:

    标签: teradata


    【解决方案1】:

    如果您使用 ANSI 模式或在 BTET 模式下发出 BT(开始交易),通常会发生此错误。

    这里有一些解决方法可以尝试:

    1. 在 create volatile table 语句之后发出ET; 语句(提交)。如果您使用 ANSI 模式,请使用 COMMIT; 而不是 ET;。如果您不确定,请依次尝试每一个。只有一个是有效的,但两者都做同样的事情。确保您的 Volatile 表包含 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 等客户端工具一起使用的原因之一。

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

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 2016-04-25
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多