2012-02-21 39 views
0

我们必须进行一天处理的结束来提取体系的日常事务,只有变化转移到系统B.变更记录集成

的问题是,制度只能提供全套的需要在系统A中可用的事务。

我最初的想法是使用一个临时表(SQL Server),它将持久存储来自系统A的数据,然后用于比较目的,以便每天执行一天的比较结束。这可以通过使用表连接来确定所需的UPDATE,INSERT,DELETE。

不是SSIS专家我理解这可以在SSIS中使用LOOKUP来完成添加,更新和删除操作。

问:

  1. 是在SSIS的解决方案更好的方法,为什么(可维护性,可扩展性,可扩展性)?

  2. 哪个更好?有关这2种选择的经验?

  3. 有没有其他的选择?

+0

我们在源系统和目标系统中讨论了什么样的数据量?目标机器是什么版本的SQL Server(2005,2008,2008R2,2012)?什么版本(标准版,企业版,数据中心版,BI版)? – billinkc 2012-02-21 14:40:04

+0

你关心这个问题吗? – 2012-02-29 17:22:35

回答

0

由于您需要来自系统A的全部交易,因此您可以根据来源限制您的选择。我建议将这些数据下拉到原始文件目的地。这会在开发时帮助你,因为你可以不需要重新调整就可以反复运行需要这些数据的任务。另外,请确保源数据按源机器排序。除非您使用第三方组件(在某些情况下这可能是限制职业生涯的决定),SSIS在排序方面非常薄弱。

无论如何,让我们假设你有那个排序的原始文件。接下来你要做的就是把它作为一个原始文件源放到数据流中。然后,有一个表示系统B的OLEDB(或其他)源。如果你喜欢,也可以使用原始文件。确保系统B的数据使用与系统A相同的列进行排序。

使用IsSorted = True标记源,并在元数据中的适当列上设置SortKey值。这将告诉SSIS数据是预先排序的,它将允许您加入您的关键列。否则,您可能需要等待几天,才能对SSIS进行排序。

将多播添加到系统A和系统B的源中,因为我们希望利用它们两次。

接下来,添加合并连接以将两个原始文件源连接在一起。使系统A成为左输入。系统B将在您将其连接到合并联接时成为正确的输入。 SSIS会自动在上一步中标记的那些已排序列上设置JOIN。将合并连接设置为使用LEFT JOIN。这样,我们可以在系统B中找到不存在于系统B中的行,并且可以比较现有的行以查看它们是否已更改。

接下来,添加一个条件拆分。在那里,你可以根据条件定义2个输出缓冲区。

NewRows:ISNULL(MyRightTable。的PrimaryKey)
UpdatedRows:无论构成更新的行]

默认的输出将采取一切行不符合这些条件2,并且可以安全地忽略。

我们没有完成。

添加另一个合并加入。

这次,从System B的MultiCast输入左边的输入。从系统A的MultiCast输入正确的输入。再次,SSIS将为您设置连接密钥。将合并连接设置为使用左连接。

添加一个条件性拆分下来这个流程,你唯一需要的是这样的:

DeletedRows:ISNULL(MyRightTable.PrimaryKey)

默认的输出将采取所有其他的行,可以忽略。

现在你有3个缓冲区。

其中2个来自您的第一个合并连接,并且代表新行和更新行。 其中1个来自您的第二个合并加入,并表示已删除的行。

采取行动。