Teradata 3707报错:')'后缺名称、Unicode分隔标识符或UDFCALLNAME关键字
Teradata 3707语法错误原因及修复方案
错误根因
- 第一个SELECT查询结尾存在多余的右括号
),无匹配的左括号对应,是触发3707报错的直接原因之一。 - 两个SELECT语句直接拼接未做结构关联:第一个查询的结果需要作为第二个查询的数据源,没有用CTE/子查询包裹,也没有定义对应的别名。
- 表函数
RegExp_Split_To_Table的返回定义末尾多了3个多余的右括号))),括号完全不匹配。 - 表函数调用时引用了未定义的别名
t的字段,没有用LATERAL关键字关联前置的查询结果。 - WHERE条件中未对AND/OR逻辑加括号分组,会导致执行逻辑不符合预期(不属于语法报错原因,但属于隐含逻辑问题)。
修正后的SQL代码
WITH t AS ( SELECT ma.MHKAUDITLOGINTERNALID AS id, CAST(MHK_CONTENT AS VARCHAR(8000)) AS MHK_CONTENT, CREATEDBY FROM vcoreMEDHOK_MHK_Audit AS ma WHERE ma.AUDITDATETIME >= DATE '2021-08-01' AND ( ma.MHKAPPEALSINTERNALID IS NOT NULL OR ma.MHKAPPEALSINTERNALID <> ' ' OR ma.MHKAPPEALSINTERNALID <> ' - ' ) ) SELECT dt.id, dt.TokenNum, REGEXP_REPLACE(dt.MHK_CONTENT, '<b>|</b>') AS NewContent, t.CREATEDBY FROM t LATERAL TABLE ( RegExp_Split_To_Table(t.id, t.MHK_CONTENT, '<br/>*', 'i') ) RETURNS (id BIGINT, TokenNum INT, MHK_CONTENT VARCHAR(8000)) AS dt
调整说明
- 用WITH子句定义第一个查询为CTE别名t,给后续表函数调用提供数据源
- 给WHERE的OR条件加了括号,保证日期过滤生效的前提下判断MHKAPPEALSINTERNALID的三个条件
- 删除了所有多余的不匹配括号
- 用LATERAL关联CTE和表函数返回结果
- CREATEDBY字段来自原表,从CTE中直接取即可,不需要放在表函数的返回定义里
内容的提问来源于stack exchange,提问作者Tekno Joe
相关产品推荐
相关产品推荐

