【发布时间】: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 作业。