You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Teradata UDF调用报错:TableKind数据类型与定义类型不匹配

问题分析与解决方案

错误根源:未限定UDF的数据库前缀导致语法解析混淆

你遇到的3706 : 42000错误,核心原因是调用UDF时没有指定所属的数据库前缀,导致Teradata的解析器误解了你的语法意图。

具体来说,你的UDFGET_OBJECT_TYPE是创建在MIGRATION_TOOL数据库下的,但查询中直接使用了GET_OBJECT_TYPE(B.TABLEKIND)——如果当前会话的默认数据库不是MIGRATION_TOOL,Teradata会找不到这个UDF,进而尝试将GET_OBJECT_TYPE解析为一个用户定义类型(UDT)的构造函数,把括号里的TABLEKIND当作类型参数。但TABLEKIND并不是预定义的用户类型,因此就抛出了“Data Type 'TABLEKIND' does not match a Defined Type name”的错误。

验证你的类型兼容性假设

先确认你之前的判断是正确的:Teradata中CHAR(1)确实可以隐式转换为VARCHAR(2),所以参数类型本身不是问题,这个错误和类型兼容无关。

解决步骤

修改查询中的UDF调用,加上数据库前缀MIGRATION_TOOL.即可:

SELECT 
    A.DATABASE_ID, 
    B.TABLENAME AS OBJECT_NAME, 
    MIGRATION_TOOL.GET_OBJECT_TYPE(B.TABLEKIND) AS OBJECT_TYPE, -- 新增数据库前缀
    MAX(CASE WHEN IDCOLTYPE IS NULL THEN 0 ELSE 1 END) AS FLAG_IDENTITY_COLUMN 
FROM MIGRATION_TOOL.VW_TERADATA_DATABASE A 
INNER JOIN DBC.TABLESV B ON A.DATABASE_NAME = B.DATABASENAME 
LEFT JOIN DBC.COLUMNSV C ON B.DATABASENAME = C.DATABASENAME AND B.TABLENAME = C.TABLENAME 
WHERE B.TABLENAME NOT LIKE ALL ('BKP%') 
GROUP BY 1, 2, 3

额外建议

如果经常需要调用这个UDF,可以通过SET FUNCTION = MIGRATION_TOOL;设置当前会话的默认函数数据库,这样后续调用就不用每次加前缀了,但在多数据库环境下要注意避免函数名冲突。


内容的提问来源于stack exchange,提问作者Alexis.Rolland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:45:54