Azure Data Factory向Salesforce Upsert时添加UNION后出现必填字段缺失错误
问题描述
通过Azure Data Factory(ADF)复制活动的Upsert功能,将存储过程生成的数据加载到Salesforce。原本管道运行正常,在存储过程中添加UNION操作后,出现以下错误:
ErrorCode=SalesforceOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Salesforce Operation Failed: REQUIRED_FIELD_MISSING:Required fields are missing: [ERROR_EXAMPLE_FIELD]:ERROR_EXAMPLE_FIELD --,Source=Microsoft.DataTransfer.Runtime.SalesforceConnector,'
确认ERROR_EXAMPLE_FIELD存在于存储过程中且未修改,已将Upsert ID设为对象主键"ID",尝试将缺失字段设为Upsert ID、重新创建复制活动均无效;恢复存储过程修改后可正常运行,但需保留UNION的修改。
存储过程代码:
SELECT curated.[Id] , curated.[ERROR_EXAMPLE_FIELD] FROM curated_hash curated LEFT JOIN staging Staging ON curated.id = Staging.Id WHERE curated.Hash_id != staging.Hash_id UNION SELECT verify_new_record.[Id] , verify_new_record.[ERROR_EXAMPLE_FIELD] FROM verify_new_record
原因分析
核心问题出在UNION后的结果集中存在ERROR_EXAMPLE_FIELD为NULL的行,而Salesforce中该字段是必填项:
- 第一个SELECT语句通过LEFT JOIN获取的数据,ERROR_EXAMPLE_FIELD均有有效值(否则原管道不会正常运行);
- 第二个SELECT语句的
verify_new_record表中,部分行的ERROR_EXAMPLE_FIELD为NULL,UNION合并结果集后,这些NULL值行被传入Salesforce,触发必填字段缺失错误; - UNION操作不会修改字段名,但会保留所有行数据,包括NULL值行。
解决方案
排查并修复NULL值行
执行以下SQL检查verify_new_record表中是否存在ERROR_EXAMPLE_FIELD为NULL的行:SELECT Id, ERROR_EXAMPLE_FIELD FROM verify_new_record WHERE ERROR_EXAMPLE_FIELD IS NULL根据业务逻辑补充有效值,或直接过滤掉此类行。
修改存储过程处理NULL值
如果允许对NULL值做默认值填充,可在第二个SELECT中用ISNULL或COALESCE处理:SELECT verify_new_record.[Id] , ISNULL(verify_new_record.[ERROR_EXAMPLE_FIELD], '') AS ERROR_EXAMPLE_FIELD -- 字符串类型用空串,数字类型用0,根据字段类型调整 FROM verify_new_record若需过滤NULL值行,添加WHERE条件:
SELECT verify_new_record.[Id] , verify_new_record.[ERROR_EXAMPLE_FIELD] FROM verify_new_record WHERE ERROR_EXAMPLE_FIELD IS NOT NULL验证ADF源结果集与字段映射
在ADF复制活动的源配置中,预览存储过程的输出结果,确认ERROR_EXAMPLE_FIELD列无NULL值;同时检查字段映射,确保该字段正确对应到Salesforce的目标字段。确认Salesforce字段属性
检查Salesforce对应对象的ERROR_EXAMPLE_FIELD是否仍为必填字段,是否有近期配置变更。
内容的提问来源于stack exchange,提问作者NutellaKing

