Azure Data Factory向Dataverse/Dynamics复制数据:如何仅执行更新操作
解决方案:仅更新Dataverse/Dynamics记录,避免插入新行
我之前在业务场景里也碰到过完全一样的需求——只想更新已存在的记录,绝对不能凭空插入新行。默认的Upsert确实不符合要求,下面分享几个我亲测有效的实现思路,你可以根据自己用的工具来选:
1. 先查询匹配记录,再执行更新
这是最通用的思路,不管用Power Automate、SDK还是API都能落地:
- Power Automate场景:先使用「List rows」或「Get row by ID/unique column」动作,根据你的匹配条件(比如业务主键、GUID)查找目标记录。如果返回的记录数大于0,再调用「Update row」动作;如果没找到,直接跳过或者记录日志即可。
- SDK(C#/Java等)场景:先通过
RetrieveMultipleRequest或RetrieveRequest查询记录,判断返回的实体是否为空。只有当记录存在时,再构造UpdateRequest执行更新操作。
2. 使用SDK的FailIfNotFound参数强制更新仅针对存在的记录
如果你用的是Dataverse组织服务SDK,可以在UpdateRequest里设置FailIfNotFound = true,这样当目标记录不存在时,操作会直接抛出异常,而不会自动插入新记录。示例代码如下:
// 构造要更新的实体(这里以Contact为例) var contactToUpdate = new Entity("contact") { Id = new Guid("目标记录的GUID"), ["firstname"] = "更新后的名字" }; var updateRequest = new UpdateRequest { Target = contactToUpdate, FailIfNotFound = true // 关键参数:记录不存在则直接失败 }; try { // 执行更新请求 service.Execute(updateRequest); } catch (FaultException<OrganizationServiceFault> ex) { // 捕获记录不存在的错误(对应错误码:-2147220937) if (ex.Detail.ErrorCode == -2147220937) { Console.WriteLine("目标记录不存在,跳过本次更新"); // 这里可以添加日志、跳过逻辑等自定义处理 } else { // 处理其他类型的异常 throw; } }
3. Power Automate直接用「Update row」替代Upsert
很多人可能没注意,Power Automate里除了Upsert动作,还有单独的「Update row」动作。这个动作要求你必须指定要更新的记录ID(或者通过唯一标识列精准查找),如果找不到对应的记录,它会直接报错,绝对不会插入新行。你可以在这个动作的「Configure run after」里设置“失败时继续”,这样遇到不存在的记录时,流程会跳过这条继续执行后续步骤。
4. 直接调用Dataverse Web API的PATCH请求
如果用API方式操作,直接发送PATCH请求到指定记录的端点:
PATCH [你的组织URI]/api/data/v9.2/contacts(目标记录GUID) Content-Type: application/json { "firstname": "更新后的名字" }
如果目标记录不存在,API会返回404状态码,不会创建新记录。你可以在调用时捕获这个状态码,做对应的跳过或日志处理。
内容的提问来源于stack exchange,提问作者DataNovice
相关产品推荐
相关产品推荐

