我试图创建SSIS包,它会定期将数据发送到其他数据库。我只想发送新记录(我需要保留已发送的记录),所以我在源表中创建了状态列。
我希望我的软件包在成功发送数据后更新此列,但我无法更新所有行和未发送的#34;状态,因为在包执行期间可能已经添加了一些行,而且我也无法使用事务(我的意思是隔离级别可以解决我的问题:我无法使用Serializable,因为我无法阻止用户添加新行,而Sequence Container不支持快照。
我的下一个想法是使用记录集,并在将数据发送到其他数据库之后使用它来获取已发送行的ID,但我找不到将其用作数据源的方法。
我不认为我应该设置状态"发送"然后将其更新为"发送",我相信这将是昂贵的。
现在我正在考虑使用临时表,但我不相信这是正确的方法,我错过了什么?
答案 0 :(得分:1)
记录集是目的地。您无法在数据流任务中使用它。 但由于数据已保存到变量,因此可在控制流中使用。
完成DataFlow后,转到控制流并创建一个可以在ResultSet varialbe上运行的foreach组件。 将每个记录集值读入变量并使用它来运行更新查询。
另外,看看“查找转换”是否对您有用。您可以生成匹配或不匹配的行。
我会根据讨论改进答案
答案 1 :(得分:0)
这里有一个非常典型的数据镜像问题。首先,我不会简单地使用一个布尔值来表示记录已“发送”到目标(镜像)数据库。至少,我会在源表中放置一个LastUpdated datetime列,并在插入和更新时在该表上设置触发器,将系统日期放入该列。然后,每天我都会执行一个读取上周更新记录的SSIS包,检查目标中是否存在这些记录,将数据流拆分为已存在的记录和目标中不存在的记录。对于那些存在的,如果目标中的LastUpdated小于源中的LastUpdated,则使用源中的值更新它们。对于目标中不存在的那些,请从源插入记录。
如果你还需要处理记录删除,它会变得更有趣。
我知道每天阅读和检查一周的价值可能看起来很浪费,但是你的数据库几乎感觉不到它,它提供了很多很好的双重检查,并通过提供一个简单的容错算法为你省去了很多麻烦。由于网络出现了一些打嗝,有些记录没有被转移,没有后顾之忧,第二天它就被拿起了。
我仍然会将SSIS包设置为服务器任务,向我发送包含任何错误的电子邮件,以便我可以跟踪。大多数时候,你没有错误,当有错误时,你可以等一天或解决原因,让接下来的几天来解决问题。
答案 2 :(得分:0)
我正在做类似的事情,在我的情况下,我在源记录上有一个状态。
根据您的操作,您可以使用状态标记在某些时候出错的记录,并需要进一步关注。