ADF数据流输出活动指标检查失败,Lookup活动SQL语法报错求助
问题解决:ADF Lookup活动SQL表达式解析错误修复
错误原因分析
- ADF表达式嵌套语法错误:原代码在
if函数内重复嵌套@{}标记,导致解析时出现括号、引号不匹配,触发SQL语法报错。 - 空引用与类型不兼容:若数据流未生成sink指标,直接访问
activity('dataflow').output.runStatus.metrics.sink.rowsWritten会返回空值;同时将数值以字符串格式赋值给INT类型变量,也会引发类型错误。 - SQL语法冗余:
update语句中多余的table关键字不符合SQL Server语法规范。
修正后的表达式
DECLARE @Date DATETIME; SET @Date = GETDATE(); DECLARE @ROWSAFFECT INT; SET @ROWSAFFECT = @{if(contains(activity('dataflow').output.runStatus.metrics, 'sink'), string(activity('dataflow').output.runStatus.metrics.sink.rowsWritten), '0')}; UPDATE [schema].[audit_table] SET LOAD_STATUS = 'Success', ROWS_AFFECTED = @ROWSAFFECT; SELECT 1;
关键修正点
- 简化表达式嵌套:ADF内置函数(如
if、contains)内部直接引用活动输出,无需额外包裹@{},仅在整个动态内容块外层保留该标记。 - 安全判断sink存在性:用
contains(activity('dataflow').output.runStatus.metrics, 'sink')先确认metrics中存在sink节点,避免空引用错误。 - 保证类型兼容:通过
string()将rowsWritten转为字符串格式,确保赋值给SQL INT变量时格式合法。 - 清理冗余SQL关键字:删除
update后的table关键字,符合SQL Server语法要求。
额外优化方案
若数据流的sink名称不固定,可改用exists函数更灵活地判断节点存在性:
DECLARE @Date DATETIME; SET @Date = GETDATE(); DECLARE @ROWSAFFECT INT; SET @ROWSAFFECT = @{if(exists(activity('dataflow').output.runStatus.metrics.sink), string(activity('dataflow').output.runStatus.metrics.sink.rowsWritten), '0')}; UPDATE [schema].[audit_table] SET LOAD_STATUS = 'Success', ROWS_AFFECTED = @ROWSAFFECT; SELECT 1;
内容的提问来源于stack exchange,提问作者vidhya rajan
相关产品推荐
相关产品推荐

