Teradata TPT DDL Operator判断删表时报字符字面量缺失错误咨询
问题根因分析
- 第一版脚本的核心错误:TPT的DDL Operator仅支持执行DDL语句,无法执行SELECT查询逻辑,你将查询
dbc.TablesV的语句直接传给DDL操作符本身就不符合语法要求;同时字符串内层的单引号转义错误,TPT解析字符串字面量失败,直接触发语法报错。 - 第二版脚本的错误:
CASE WHEN ACTIVITYCOUNT是BTEQ的流程控制语法,不能直接在TPT脚本中使用,TPT原生没有这类条件判断语法。
可行解决方案
方案一:使用原生DROP TABLE IF EXISTS语法(推荐,适用于Teradata 14.10及以上版本)
Teradata 14.10之后已经原生支持IF EXISTS判断,无需自行实现查询逻辑,可直接规避所有语法问题,修改后的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, varchar DatabaseName = @Db ); APPLY 'DROP TABLE IF EXISTS @Table;' TO OPERATOR(DDL_OPERATOR); );
该写法执行时如果目标表不存在,Teradata仅返回警告不会抛出错误,TPT作业可正常完成。
方案二:低版本Teradata兼容方案
如果你的Teradata版本低于14.10不支持IF EXISTS,直接使用BTEQ脚本实现该需求更简单,无需使用TPT:
.logon ${TERADATA_TDP}/${User},${Pwd}; DATABASE ${Db}; SELECT 1 FROM dbc.TablesV WHERE databasename = '${Db}' AND tablename = '${Table}'; .IF ACTIVITYCOUNT = 1 THEN .GOTO DROP_TABLE .GOTO EXIT .LABEL DROP_TABLE DROP TABLE ${Table}; .LABEL EXIT .logoff; .quit;
注意事项
执行作业时注意tbuild/BTEQ命令传入的变量名要和脚本内使用的变量名保持一致,例如脚本内使用@Db变量,tbuild命令就要传Db=$DB,否则会触发变量未定义错误。
内容的提问来源于stack exchange,提问作者violetteviolette
相关产品推荐
相关产品推荐

