以下是以下情况: 我有一个 StudentsA 表,需要与另一个表同步,在另一台服务器上, StudentsB 。这是从A到B的单向同步。 由于StudentsA表可以容纳大量行,因此我们有一个名为 StudentsSync 的表(在输入服务器上),其中包含自上次修改后的 StudentsA ID从 StudentsA 复制到 StudentsB 。
我做了以下SSIS数据流任务:
唯一的问题是我需要在成功复制或更新后从 StudentsSync 删除行。像这样:
知道如何实现这一目标吗?
答案 0 :(得分:1)
可以使用3种方法实现
1.如果target
中的OutputDB
表格包含TimeStamp
和Create
等modified TimeStamp
个列,则表示行updated
或可以通过编写简单查询来获取inserted
。您需要在execte sql task
Control Flow
中的delete
中向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
表中存在Sync
primary key
以及Target
表的new row
。上述条件基本上会检查,如果added
为CreateTimeStamp
,则current
列的日期为modifiedTimeStamp
,null
为updated
,否则值为modifiedTimeStamp
,则TimeStamp
将具有当前日期
如果您的target
表格中有Data Warehouse
个列,如果您将数据加载到MERGE
2.您可以使用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
代码没有经过测试,因为我已经没时间了。但至少它应该让你知道如何继续。 。有关Multicast
语法的详细信息,请阅读this和this
3.将duplicate
组件用于Insert
Update
和MULTICAST
的数据集。将lookmatch
连接到Lookup No match output
输出和另一个多播到{{1}}
答案 1 :(得分:0)