在ADF中无需Dataflow检查本地SAP Hana数据库的列及数据类型
在ADF中无Dataflow时验证SAP Hana数据列的存在性与数据类型
一、列存在性校验
方法1:查询系统表获取列列表后校验
SAP Hana的SYS.COLUMNS系统视图能直接读取表的元数据,用它来获取目标表的所有列,再和你需要的列做比对:
- 新建Lookup活动,连接本地SAP Hana数据源,执行以下SQL:
SELECT COLUMN_NAME FROM SYS.COLUMNS WHERE SCHEMA_NAME = '<你的Schema名称>' AND TABLE_NAME = '<目标表名称>' - 这个Lookup会返回目标表的所有列名集合。
- 加个If Condition活动,用ADF表达式判断所需列是否全部存在。比如要检查
col1、col2、col3:- 简单写法(适合列少的情况):
and(contains(activity('Lookup列信息').output.value, 'col1'), contains(activity('Lookup列信息').output.value, 'col2'), contains(activity('Lookup列信息').output.value, 'col3')) - 灵活写法(适合列多的场景):先定义变量
requiredColumns为数组['col1','col2','col3'],然后用交集函数判断:length(intersection(variables('requiredColumns'), activity('Lookup列信息').output.value)) == length(variables('requiredColumns'))
- 简单写法(适合列少的情况):
- 根据If Condition的结果分支走逻辑:校验通过就继续提数;不通过就抛出错误或者发告警(比如用Web活动通知)。
方法2:直接查询目标列,捕获异常
直接构造包含所有所需列的查询,用Try-Catch块抓列不存在的错误:
- 新建Lookup活动,SQL语句只查所需列,加
LIMIT 0只拿元数据不拿实际数据,效率更高:SELECT col1, col2, col3 FROM <Schema>.<目标表名> LIMIT 0 - 把这个Lookup放进Try块,Catch块里处理错误:
- 通过
@activity('Lookup校验列').error.message获取错误信息,判断是不是列不存在的异常(SAP Hana会返回类似invalid column name的提示)。 - 执行错误处理逻辑,比如终止流水线或者记录错误日志。
- 通过
二、数据类型检查
还是用SYS.COLUMNS视图,同时查列名和数据类型,再和预期类型对比:
- 修改Lookup活动的SQL,同时获取列名和对应数据类型:
SELECT COLUMN_NAME, DATA_TYPE_NAME FROM SYS.COLUMNS WHERE SCHEMA_NAME = '<你的Schema名称>' AND TABLE_NAME = '<目标表名称>' - 在If Condition里写表达式校验。比如预期
col1是VARCHAR,col2是INTEGER:and( equals(first(filter(activity('Lookup列类型').output.value, item().COLUMN_NAME == 'col1')).DATA_TYPE_NAME, 'VARCHAR'), equals(first(filter(activity('Lookup列类型').output.value, item().COLUMN_NAME == 'col2')).DATA_TYPE_NAME, 'INTEGER') ) - 同样用If Condition分支处理校验结果。
三、完整流水线流程参考
- 先初始化变量:定义
requiredColumns(存所需列的数组)、expectedTypes(键值对,键是列名,值是预期数据类型)。 - 执行Lookup活动,拉取目标表的列名和类型信息。
- 用If Condition同时校验列存在性和数据类型。
- 校验通过:执行主Lookup活动提取实际业务数据。
- 校验不通过:执行错误处理逻辑(比如抛错、写日志)。
内容的提问来源于stack exchange,提问作者Rahul Singh
相关产品推荐
相关产品推荐

