【问题标题】:Teradata Parallel Transporter DDL Operator - missing { EXTENDED_LITERAL_ CHAR_STRING_LITERAL_ } in Rule: Character String Literal ERRORTeradata Parallel Transporter DDL 运算符 - 规则中缺少 { EXTENDED_LITERAL_ CHAR_STRING_LITERAL_ }:字符串文字错误
【发布时间】:2021-11-15 00:17:51
【问题描述】:

我想要做的是检查我的数据库是否存在我的表,如果存在则删除它。这是我的 .tpt :

DEFINE JOB DELETE_ET_TABLES
DESCRIPTION 'Delete ET tables'
(
        DEFINE OPERATOR DDL_OPERATOR
          DESCRIPTION 'Teradata Parallel Transporter DDL Operator'
          TYPE DDL
          ATTRIBUTES
          (
                varchar TdpId = @TERADATA_TDP,
                varchar UserName = @User,
                varchar UserPassword = @Pwd
          );

        APPLY  
                'SELECT (CASE WHEN TableName = ''Test_Del'' 
                              THEN (''DROP TABLE @Table;'')
                              ELSE NULL
                         END)
                 FROM dbc.TablesV WHERE databasename = @Db;'  TO OPERATOR(DDL_OPERATOR);

这是我收到的错误消息:

Running "tbuild" command: tbuild -f /$HOME/loaders/test_deleteETTables.tpt -u TERADATA_TDP=$TDP, TERADATA_DATABASE=$DB -L /$LOG/
Teradata Parallel Transporter Version 16.20.00.09 64-Bit
TPT_INFRA: Syntax error at or near line 18 of Job Script File '/$HOME/loaders/test_deleteETTables.tpt':
TPT_INFRA: At "(" missing { EXTENDED_LITERAL_ CHAR_STRING_LITERAL_ } in Rule: Character String Literal
Compilation failed due to errors. Execution Plan was not generated.

你有什么想法吗?我尝试了多种方法,例如:

SELECT 1 FROM dbc.TablesV WHERE databasename = @Db AND TABLENAME ='TEST_DEL';
CASE WHEN ACTIVITYCOUNT = 1
    THEN (DROP TABLE @Table)
    ELSE ( QUIT )
END;

我的所有变量都已声明。我觉得在 que 语句中使用单引号是个问题,但我不确定,也不知道如何解决。非常感谢您的宝贵时间。

【问题讨论】:

  • 你的字符变量,比如@db,有单引号吗?
  • 我认为这是由于使用了 NULL 但是 SELECT 对 DDL 运算符无效。推荐的方法是简单地将DROP 传递给操作员并告诉它忽略“未找到”(并认为成功),即ErrorList='3807'
  • 感谢两位的回答!事实上,弗雷德,这就是我最终选择做的事情,我一开始就考虑过,但想要一个更“合适”的解决方案。它最终工作正常。您知道使用两种不同的 DDL(一种用于选择,一种用于丢弃)是否可行?再来一次,谢谢你的时间
  • 不,即使您对 SELECT 使用不同的运算符,您也无法在同一个 TPT 作业中有条件地生成/执行 DROP。您可以有多个 TPT 作业以及围绕它们的一些“shell”脚本,或者用于条件执行的 BTEQ,然后是 TPT 作业。

标签: teradata ddl


【解决方案1】:

Fred 建议我在 cmets 中尝试的解决方案效果很好:

我认为这是由于使用了 NULL 但 SELECT 对 DDL 运算符无效。推荐的方法是简单地将 DROP 传递给操作员并告诉它忽略“未找到”(并认为成功),即 ErrorList='3807'

DESCRIPTION 'Delete ET tables'
(
        DEFINE OPERATOR DDL_OPERATOR
          DESCRIPTION 'Teradata Parallel Transporter DDL Operator'
          TYPE DDL
          ATTRIBUTES
          (
                varchar TdpId = @TERADATA_TDP,
                varchar UserName = @USERDB,
                varchar UserPassword = @PWD,
                VARCHAR ErrorList = '3807'
          );

        APPLY
        ('DROP TABLE @TABLENAME')
        TO OPERATOR(DDL_OPERATOR);
);```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2013-07-07
    • 2020-07-13
    • 2023-03-22
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多