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
相关产品推荐
相关产品推荐

