如何控制通过SSIS发送的行

时间:2015-08-04 13:42:32

标签: sql-server ssis ssis-2012

我试图创建SSIS包,它会定期将数据发送到其他数据库。我只想发送新记录(我需要保留已发送的记录),所以我在源表中创建了状态列。

我希望我的软件包在成功发送数据后更新此列,但我无法更新所有行和未发送的#34;状态,因为在包执行期间可能已经添加了一些行,而且我也无法使用事务(我的意思是隔离级别可以解决我的问题:我无法使用Serializable,因为我无法阻止用户添加新行,而Sequence Container不支持快照。

我的下一个想法是使用记录集,并在将数据发送到其他数据库之后使用它来获取已发送行的ID,但我找不到将其用作数据源的方法。

我不认为我应该设置状态"发送"然后将其更新为"发送",我相信这将是昂贵的。

现在我正在考虑使用临时表,但我不相信这是正确的方法,我错过了什么?

3 个答案:

答案 0 :(得分:1)

记录集是目的地。您无法在数据流任务中使用它。 但由于数据已保存到变量,因此可在控制流中使用。

完成DataFlow后,转到控制流并创建一个可以在ResultSet varialbe上运行的foreach组件。 将每个记录集值读入变量并使用它来运行更新查询。

另外,看看“查找转换”是否对您有用。您可以生成匹配或不匹配的行。

我会根据讨论改进答案

答案 1 :(得分:0)

这里有一个非常典型的数据镜像问题。首先,我不会简单地使用一个布尔值来表示记录已“发送”到目标(镜像)数据库。至少,我会在源表中放置一个LastUpdated datetime列,并在插入和更新时在该表上设置触发器,将系统日期放入该列。然后,每天我都会执行一个读取上周更新记录的SSIS包,检查目标中是否存在这些记录,将数据流拆分为已存在的记录和目标中不存在的记录。对于那些存在的,如果目标中的LastUpdated小于源中的LastUpdated,则使用源中的值更新它们。对于目标中不存在的那些,请从源插入记录。

如果你还需要处理记录删除,它会变得更有趣。

我知道每天阅读和检查一周的价值可能看起来很浪费,但是你的数据库几乎感觉不到它,它提供了很多很好的双重检查,并通过提供一个简单的容错算法为你省去了很多麻烦。由于网络出现了一些打嗝,有些记录没有被转移,没有后顾之忧,第二天它就被拿起了。

我仍然会将SSIS包设置为服务器任务,向我发送包含任何错误的电子邮件,以便我可以跟踪。大多数时候,你没有错误,当有错误时,你可以等一天或解决原因,让接下来的几天来解决问题。

答案 2 :(得分:0)

我正在做类似的事情,在我的情况下,我在源记录上有一个状态。

  1. 我读了所有状态为新的记录。
  2. 然后使用 OLE DB命令在每一行上执行SQL,进行更改 状态为“进行中”(在您的位置,输入?作为值。) “组件属性”选项卡,您可以将其配置为参数 来自表格行,如列映射中的ID或某些pk 标签)。
  3. 处理完记录后,您可以更改所有“进行中” 使用另一个OLE DB记录到“成功”或类似的东西 命令。
  4. 根据您的操作,您可以使用状态标记在某些时候出错的记录,并需要进一步关注。