Azure ADF复制数据活动-在插入SQL db之前检查重复记录

Azure ADF复制数据活动-在插入SQL db之前检查重复记录,azure,azure-sql-database,azure-data-factory,azure-data-factory-2,Azure,Azure Sql Database,Azure Data Factory,Azure Data Factory 2,我有一个非常简单的ADF管道将数据从本地mongoDB(自托管集成环境)复制到Azure SQL数据库 我的pipleline能够从mongoDB复制数据并插入SQL db。 当前,如果我运行管道,它会在多次运行时插入重复数据 我已经使_id列在SQL数据库中是唯一的,现在运行管道抛出和错误,因为SQL约束不允许它插入记录 如何在插入SQL db之前检查重复id? 我应该使用预复制脚本/存储过程吗? 一些指导/指示将有助于增加额外步骤。谢谢您应该在预复制脚本中实现SQL逻辑以消除重复Azure

我有一个非常简单的ADF管道将数据从本地mongoDB(自托管集成环境)复制到Azure SQL数据库

我的pipleline能够从mongoDB复制数据并插入SQL db。 当前,如果我运行管道,它会在多次运行时插入重复数据

我已经使_id列在SQL数据库中是唯一的,现在运行管道抛出和错误,因为SQL约束不允许它插入记录

如何在插入SQL db之前检查重复id?

我应该使用预复制脚本/存储过程吗?
一些指导/指示将有助于增加额外步骤。谢谢

您应该在预复制脚本中实现SQL逻辑以消除重复

Azure Data Factory可以帮助您实现以下目标:

您可以按照以下步骤操作:

  • 添加两个源:Cosmos db表(source1)和SQL数据库表(source2)
  • 使用active从Cosmos table.id=SQL table.id上的两个表(左连接/全连接/右连接)获取所有数据。

  • 表达式来过滤重复的_id,它不重复,然后插入它。

  • 然后将无重复列映射到Sink SQL数据库表


  • 希望这有帮助。

    目前,我使用一个存储过程获得了解决方案,就这个需求而言,这看起来工作量要少得多

    我关注了这篇文章:

    我创建了表类型,并在存储过程中用于检查是否存在重复

    我的存储过程非常简单,如下所示:

    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[spInsertIntoDb]
        (@sresults dbo.targetSensingResults READONLY)
    AS
    
    BEGIN
    
    MERGE dbo.sensingresults AS target
    USING @sresults AS source
    ON (target._id = source._id)
    
    WHEN NOT MATCHED THEN
        INSERT (_id, sensorNumber, applicationType, place, spaceType, floorCode, zoneCountNumber, presenceStatus, sensingTime, createdAt, updatedAt, _v)
        VALUES (source._id, source.sensorNumber, source.applicationType, source.place, source.spaceType, source.floorCode,
         source.zoneCountNumber, source.presenceStatus, source.sensingTime, source.createdAt, source.updatedAt, source.updatedAt);
    END
    
    我认为,如果我需要进行更多的转换,使用存储过程应该可以,并且在将来也会有所帮助


    请让我知道在这种情况下使用存储过程在将来是否有潜在风险

    要删除重复项,可以使用复制前脚本。或者,您可以使用“复制”活动将增量数据或新数据存储到临时表中,并使用存储过程从主表中删除删除后临时表中的ID,然后将临时表数据插入主表。然后删除临时表。

    如果我想检查_id值aleady exists,那么预复制脚本会是什么样子。源和目标数据集都有_id字段。感谢您花时间讨论此问题。我开始创造狂欢。请您查看我发布的答案,如果您发现其中存在任何风险,请发表您的评论。忘了提及,我在发布问题之前尝试创建数据流,但第一步是源选择,我无法将我的mongoDB设置为源数据集。看起来它现在是ADF数据流的一个限制?在我的情况下,这个选项不起作用。id是一个字符串/varchar,尽管我遵循了上述步骤,但重复项仍然插入到我的SQL DB中。有什么想法吗?我会以类似的方式处理,但有一些变化。我将有两个任务:一个复制任务将数据加载到一个临时表中,其中包含一个截断临时表的预复制脚本),然后是一个存储过程任务,它调用一个处理所有逻辑的存储过程,例如
    INSERT-in。。。选择。。。从…起不存在的地方…
    。注意
    MERGE
    不会从源代码中明确删除重复项,即它不会执行
    SELECT DISTINCT
    。有意义吗?你能帮我做这件事的预拷贝脚本吗?还有,我如何制作暂存台?我们现在已经改变了要求。基本上,很多数据都来自物联网设备。因此,在插入SQL db之前,我们需要首先从mongoDB聚合数据(比如说,每隔10分钟聚合一次)