如何使用复制活动中的复制前脚本根据源中的更改跟踪表删除接收器中的记录?

How to use the pre-copy script from the copy activity to remove records in the sink based on the change tracking table from the source?(如何使用复制活动中的复制前脚本根据源中的更改跟踪表删除接收器中的记录?)
本文介绍了如何使用复制活动中的复制前脚本根据源中的更改跟踪表删除接收器中的记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用更改跟踪以增量方式将数据从SQL Server复制到Azure SQL数据库。我遵循了Microsoft Azure文档中的tutorial,但在为大量表实现此操作时遇到了一些问题。 在复制活动的源部分中,我可以使用一个查询,该查询为我提供了一个更改表,其中包含自上次更改跟踪版本以来更新、插入或删除的所有记录。此表看起来类似
PersonID   Age    Name   SYS_CHANGE_OPERATION
---------------------------------------------
1          12     John   U
2          15     James  U
3          NULL   NULL   D
4          25     Jane   I

PersonId是此表的主键。

问题在于,复制活动只能将数据附加到Azure SQL数据库,因此当记录更新时,它会因为重复的主键而给出错误。我可以通过让复制活动使用将数据合并到Azure SQL数据库上的表中的存储过程来处理此问题,但问题是我有大量的表。

我希望预复制脚本删除Azure SQL数据库上已删除和更新的记录,但我不知道如何做到这一点。是否需要为要复制的每个表创建单独的存储过程和相应的表类型,或者复制前脚本是否可以根据更改跟踪表删除记录?

推荐答案

您必须在复制活动之前使用查找活动。通过该查找活动,您可以查询数据库,以便获得删除和更新的PersonID,最好都在一个字段中,用逗号分隔(这样更易于在复制前脚本中使用)。此处提供更多信息:https://docs.microsoft.com/en-us/azure/data-factory/control-flow-lookup-activity

然后您可以在预拷贝脚本中执行以下操作:

delete from TableName where PersonID in (@{activity('MyLookUp').output.firstRow.PersonIDs})

这样,您将在插入新行之前删除所有已删除或更新的行。

希望这能有所帮助!

这篇关于如何使用复制活动中的复制前脚本根据源中的更改跟踪表删除接收器中的记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
SSIS: Model design issue causing duplications - can two fact tables be connected?(SSIS:模型设计问题导致重复-两个事实表可以连接吗?)
SQL Server Graph Database - shortest path using multiple edge types(SQL Server图形数据库-使用多种边类型的最短路径)
Invalid column name when using EF Core filtered includes(使用EF核心过滤包括时无效的列名)
How should make faster SQL Server filtering procedure with many parameters(如何让多参数的SQL Server过滤程序更快)
How can I generate an entity–relationship (ER) diagram of a database using Microsoft SQL Server Management Studio?(如何使用Microsoft SQL Server Management Studio生成数据库的实体关系(ER)图?)