ADF ForEach循环中Lookup Activity插入SQL成功却报错求助
问题现象
在Azure Data Factory(ADF)的ForEach迭代中,使用Lookup Activity执行Azure SQL Server插入语句,目标表数据已成功插入,但每次迭代都报错,错误信息如下:
Failure happened on 'Source' side.ErrorCode=SqlInvalidDbQueryString,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=The specified SQL Query is not valid. It could be caused by that the query doesn't return any data. Invalid query: 'INSERT INTO dbo.sampletable(id,name,Decription,Details,Status,Failure,date)VALUES('13','test','test',' ','Success','NULL','2023/08/22')',Source=Microsoft.DataTransfer.ClientLibrary,'
使用的插入语句:
INSERT INTO dbo.sampletable (id ,name ,Decription ,Details ,Status ,Failure ,date) VALUES('@{variables('var_id')}', 'test', 'test', '@{string(item())}', 'Success', 'NULL', '@{variables('current_date')}' )
问题原因
Lookup Activity的设计核心是查询并返回数据集,执行INSERT这类不返回结果集的SQL语句时,ADF会判定查询无效,即使插入操作本身已经成功执行。
解决方案
1. 替换为Stored Procedure Activity(推荐)
Stored Procedure Activity专门用于执行无返回结果的SQL操作(如INSERT、UPDATE、DELETE),完全适配这类场景:
- 创建存储过程封装插入逻辑:
CREATE PROCEDURE InsertSampleData @id VARCHAR(50), @name VARCHAR(50), @Decription VARCHAR(50), @Details VARCHAR(MAX), @Status VARCHAR(50), @Failure VARCHAR(MAX), @date DATE AS BEGIN INSERT INTO dbo.sampletable(id, name, Decription, Details, Status, Failure, date) VALUES(@id, @name, @Decription, @Details, @Status, @Failure, @date) END - 在ADF中添加Stored Procedure Activity,配置SQL连接和存储过程,传入对应变量及
item()值作为参数。
2. 修改INSERT语句返回结果集(临时方案)
如果暂时不想用存储过程,可在INSERT语句后追加查询返回结果,让Lookup能获取到数据集:
INSERT INTO dbo.sampletable (id ,name ,Decription ,Details ,Status ,Failure ,date) VALUES('@{variables('var_id')}', 'test', 'test', '@{string(item())}', 'Success', NULL, -- 注意:插入SQL NULL需去掉引号,原语句的'NULL'是字符串 '@{variables('current_date')}' ); SELECT 1 AS Result; -- 追加查询返回结果,让Lookup识别为有效查询
注意:此方案仅为临时绕过检查,并非Lookup的正确使用场景,长期建议采用第一种方案。
额外注意点
原语句中'NULL'会将字符串"NULL"插入Failure字段,若需插入SQL原生NULL值,应直接写NULL(不带引号)。
内容的提问来源于stack exchange,提问作者Developer Rajinikanth

