2

这是以下情况:我有一张StudentsA表,需要与另一台服务器上的另一个表同步,StudentsB。这是从 A 到 B 的单向同步。由于表 StudentsA 可以保存大量行,因此我们有一个名为StudentsSync的表(在输入服务器上),其中包含自上次从 StudentsA 复制以来已修改的StudentAID学生 B .

我做了以下 SSIS 数据流任务:

在此处输入图像描述

唯一的问题是我需要在成功复制或更新后从StudentSync中删除该行。像这样的东西:

在此处输入图像描述

知道如何实现吗?

4

2 回答 2

1

可以使用3种方法来实现

1.如果您的target表中 OutputDBTimeStamp列,例如 Createmodified TimeStamp然后行已经获得updatedinserted可以通过编写简单查询获得。您需要在Tableexecte sql taskControl Flowdelete这些行中写入以下查询。Sync

Delete from SyncTable
where keyColumn in (Select primary_key from target 
where ModifiedTimeStamp >= GETDATE() or (ModifiedTimeStamp is null
and CreateTimeStamp>=GETDATE()))

我假设与表一起StudentsA's primary key存在于表中。上述条件基本上检查,如果是,那么列将有日期,否则如果值是,则将有当前日期Syncprimary keyTargetnew rowaddedCreateTimeStampcurrentmodifiedTimeStampnullupdatedmodifiedTimeStamp

TimeStamp如果您的表中有列,则上述查询将起作用target,如果您将数据加载到其中,我认为这些列应该存在Data Warehouse

2.您可以使用MERGE语法来执行更新和插入。Control Flow无需Execute SQL Task使用Data Flow Task。即使您没有,也可以使用以下查询TimeStamp columns

DECLARE @Output TABLE ( ActionType VARCHAR(20), SourcePrimaryKey INT)

MERGE StudentsB  AS TARGET
USING StudentsA  AS SOURCE 
ON (TARGET.CommonColumn = SOURCE.CommonColumn) 

WHEN MATCHED 
THEN 
UPDATE SET TARGET.column = SOURCE.Column,TARGET.ModifiedTimeStamp=GETDATE()

WHEN NOT MATCHED BY TARGET THEN 
INSERT (col1,col2,Col3) 
VALUES (SOURCE.col1, SOURCE.col2, SOURCE.Col3)

OUTPUT $action, 
INSERTED.PrimaryKey AS SourcePrimaryKey INTO @Output

Delete from SyncTable
where PrimaryKey in (Select SourcePrimaryKey from @Output
                     where ActionType ='INSERT' or ActionType='UPDATE')

代码没有经过测试,因为我的时间不多了。但至少它应该让你对如何继续有一个公平的想法。.有关MERGE语法的更多详细信息,请阅读thisthis

3.使用Multicast组件到duplicate数据集Insert和。Update连接一个MULTICASTlookmatch输出和另一个多播到Lookup No match output

在此处输入图像描述

于 2013-03-29T11:51:16.700 回答
0
  1. 在“更新现有条目”之后和“插入新条目”之后添加一个任务,将学生 ID 添加到一个变量中,该变量将包含要删除的 ID 列表。
  2. 将所有任务包含在一个序列容器中。
  3. 在序列容器执行后,添加一个任务以从同步表中删除您一直在填充的变量中的所有记录。
于 2013-03-29T11:31:02.537 回答