我将尽力解释这一点。我目前有一个数据流任务,它有一个 OLE DB 源将数据从不同数据库的表传输到另一个数据库的表。它工作正常,但我遇到的问题是我不断向目标表添加重复数据。
因此,在该表中多次看到日期“2012 年 11 月 30 日”的客户 ID 为“13029”,金额为“$ 56.82”。我该如何做到这一点,以便我只能将唯一数据传输到该目标表?
我将尽力解释这一点。我目前有一个数据流任务,它有一个 OLE DB 源将数据从不同数据库的表传输到另一个数据库的表。它工作正常,但我遇到的问题是我不断向目标表添加重复数据。
因此,在该表中多次看到日期“2012 年 11 月 30 日”的客户 ID 为“13029”,金额为“$ 56.82”。我该如何做到这一点,以便我只能将唯一数据传输到该目标表?
在传输数据的数据流任务中,您可以插入查找转换。在查找中,您可以指定数据源(表或查询,最适合您的)。选择数据源后,您可以转到 Columns 视图并创建一个映射,在其中连接两个表的 CustomerID、Date 和 Amount。
在一般视图中,您可以配置匹配/不匹配行会发生什么。只需获取不匹配的输出并将其定向到 DB 目标。
您将需要确定是什么使该数据在表中独一无二。如果是客户表,则可能是 13029 的 customerid。但是,如果是客户订单表,则可能是 CustomerId 和 OrderDate 的组合(也可能不是,我在同一日期下了两个不同的订单)。根据您的餐桌设计,您将知道答案。
有了这些知识,您将需要编写一个查询以从目标表中取回键SELECT CO.CustomerId, CO.OrderId FROM dbo.CustomerOrder CO
如果您知道该过程仅传输当前年份的数据,请在上述查询中添加一个过滤器以限制返回的行数。这样做的原因是内存保护——您希望 SSIS 快速运行,不要带回它永远不需要的无关列或行。
在您的数据流中,使用该查询添加查找转换。您没有将 2005、2008 或 2012 指定为您的 SSIS 版本,它们具有与查找转换相关的不同行为。一般来说,您要做的是识别不匹配的行。根据定义, unmatched 意味着它们不存在于目标数据库中,因此这些是新的行。2005 假设每一行都将匹配或出错。您需要单击配置错误输出...按钮并选择“重定向行”。2008+ 在“指定如何处理没有匹配条目的行”下有一个选项,您需要“将行重定向到不匹配的输出”。
现在采用 No match 输出分支 (2008+) 或错误输出分支 (2005) 并将其插入您的目的地。
当源系统报告 56.82 美元而目标系统报告 22.38 美元(更新)时,这种方法不包括检测和处理。如果您需要处理这个问题,那么您需要查看一些更改检测系统。查看 Andy Leonard 的Stairway to Integration Services系列文章,了解检测和处理更改的选项。
您是否考虑过使用 T-SQL MERGE 语句?http://technet.microsoft.com/en-us/library/bb510625.aspx
它将在定义的字段上比较两个表,并在匹配与否时采取行动。