Sql server SSIS:更新或插入后删除行
情况如下: 我有一个StudentsA表,需要与另一个表同步,该表位于不同的服务器StudentsB上。这是从a到B的单向同步。 由于StudentsA表可以容纳大量行,因此我们有一个名为StudentsSync(在输入服务器上)的表,其中包含StudentsA的ID,该ID自上次从StudentsA复制到StudentsB后已被修改 我执行了以下SSIS数据流任务: 唯一的问题是,在成功复制或更新后,我需要从StudentsSync中删除该行。大概是这样的: 你知道如何做到这一点吗Sql server SSIS:更新或插入后删除行,sql-server,etl,ssis,Sql Server,Etl,Ssis,情况如下: 我有一个StudentsA表,需要与另一个表同步,该表位于不同的服务器StudentsB上。这是从a到B的单向同步。 由于StudentsA表可以容纳大量行,因此我们有一个名为StudentsSync(在输入服务器上)的表,其中包含StudentsA的ID,该ID自上次从StudentsA复制到StudentsB后已被修改 我执行了以下SSIS数据流任务: 唯一的问题是,在成功复制或更新后,我需要从StudentsSync中删除该行。大概是这样的: 你知道如何做到这一点吗 在“更
它可以通过3种方法实现 1.如果
OutputDB
中的target
表具有TimeStamp
列,例如Create
和modified TimeStamp
,则可以通过编写一个简单的查询来获得已更新的或插入的行。您需要在控制流
中的执行sql任务
中将以下查询写入删除同步
表中的那些行
Delete from SyncTable
where keyColumn in (Select primary_key from target
where ModifiedTimeStamp >= GETDATE() or (ModifiedTimeStamp is null
and CreateTimeStamp>=GETDATE()))
我假设StudentsA的
主键
与目标
表的主键
一起出现在同步
表中。上述条件基本检查,如果添加了新行
,则创建时间戳
列将具有当前
日期,修改的时间戳
将为空
,否则如果值更新
则修改的时间戳
将具有当前日期
如果在target
表中有TimeStamp
列,则上述查询将有效。如果将数据加载到数据仓库
2.您可以使用MERGE
语法执行更新,并在控制流
中插入执行SQL任务
。无需使用数据流任务
。即使您没有任何时间戳列
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
语法的详细信息,请阅读和
3.使用Multicast
组件复制数据集以插入和更新
。将一个多播连接到lookmatch
输出,将另一个多播连接到Lookup No match输出
在SSIS 2008之前,您不能在目的地之后添加组件(插入新条目)。它只会给你一个错误输出
第三个解决方案似乎最适合我的问题。我认为前两种方法在不同的服务器上使用DBs是行不通的。