Azure ADF复制数据活动-在插入SQL db之前检查重复记录
我有一个非常简单的ADF管道将数据从本地mongoDB(自托管集成环境)复制到Azure SQL数据库 我的pipleline能够从mongoDB复制数据并插入SQL db。 当前,如果我运行管道,它会在多次运行时插入重复数据 我已经使_id列在SQL数据库中是唯一的,现在运行管道抛出和错误,因为SQL约束不允许它插入记录 如何在插入SQL db之前检查重复id? 我应该使用预复制脚本/存储过程吗?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
一些指导/指示将有助于增加额外步骤。谢谢您应该在预复制脚本中实现SQL逻辑以消除重复Azure Data Factory可以帮助您实现以下目标: 您可以按照以下步骤操作:
希望这有帮助。目前,我使用一个存储过程获得了解决方案,就这个需求而言,这看起来工作量要少得多 我关注了这篇文章: 我创建了表类型,并在存储过程中用于检查是否存在重复 我的存储过程非常简单,如下所示:
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分钟聚合一次)