sql - 如何在SSIS中同步两个表

标签 sql database ssis

我有一个场景,我需要在 SSIS 中同步两个表

表 A 在数据库 A 中,表 B 在数据库 B 中。两个表具有相同的架构。我需要一个 SSIS 包,以这种方式将表 A 与表 B 同步

1。它将表 A 中存在的所有记录插入到表 B 中

2. Update TABLE B if Same "Key" exsit in Both but Updated records in Table A

例如,表 A 和 B 都包含键 = 123,表 A 中的几列都已更新。

我正在考虑使用 Merge Joins,但这仅有助于插入新记录。我如何设法实现更新的东西

最佳答案

1.It inserts all the records That Exist in Table A into Table B 

使用 lookup transformation .Source 将是 Table A,Lookup 将是 Table B。映射两个表中的公共(public)列并选择您需要插入的列。查找后使用 OLEDB 目的地 并映射来自查找的列并将其插入到 Table B

2.Update TABLE B if Same "Key" exsit in Both but Updated records in Table A

与上面的逻辑相同。使用查找而不是 OLEDB 目标,使用 OLEDB 命令,然后编写更新 sql。

Update TableB
Set col1=?,col2=?....

在列映射中,映射来自lookup

的列

看看这篇文章 Checking to see if a record exists and if so update else insert

使用合并:

MERGE TableB b
USING TableA a
ON b.Key = a.Key
WHEN MATCHED AND b.Col1<>a.Col1 THEN
UPDATE
SET b.Col1 =  a.Col1 
WHEN NOT MATCHED BY TARGET THEN
INSERT (Col1, Col2, col3)
VALUES (a.Col1, a.Col2,a.Col3);

您可以在 Control Flow 中的 Execute SQL Task 中执行 Merge SQL

更新:查找转换尝试在转换输入中的值与引用数据集中的值之间执行等值连接。

您可以只需要一个数据流任务。

图表

enter image description here

当目标表数据在源表中没有匹配值时,查找会将目标行重定向到将数据插入源表的 oledb 目标(查找无匹配输出)

当目标表行与源表的业务键匹配时,匹配的行将被发送到 Oledb 命令 并使用更新 SQL,查找中的所有目标行将被在源表中更新。

这只是一个概述。上面的设计存在问题,因为当行匹配时,无论列中的任何更改都会更新源表。所以请引用上面的文章或尝试在中搜索 SCD 组件姐姐

Update 2:

MERGE TableB b
USING TableA a
ON b.Key = a.Key
WHEN MATCHED  THEN
UPDATE
SET b.Col1 =  a.Col1 
WHEN NOT MATCHED BY TARGET AND a.IsReady=1 THEN  --isReady bit data type
INSERT (Col1, Col2, col3)
VALUES (a.Col1, a.Col2,a.Col3);

关于sql - 如何在SSIS中同步两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911637/

相关文章:

mysql - PostgreSQL pq 打开不成功 : x509: certificate signed by unknown authority

php - 如何一次匹配两个表中的记录

c# - Silverlight 2 - 使用 WCF 添加数据库记录

c# - SSIS 将数字添加到列中的重复值以使其唯一

c# - 使用本地数据库发布 Windows 窗体

sql - 在数据资源管理器中查询增长最快的标签?

c# - C#中DataGridView错误列中的数据检索

database - SOLR - 索引数据库,配置

sql-server-2005 - 使用派生列为每行创建格式为 YYYY-MM-01 00 :00:00. 000 的日期值

ssis - 哪个 SSIS 转换可以执行 SQL 查询中使用的 'NOT IN' 约束?