如何控制哪些行通过 SSIS 发送

How to control which rows were sent via SSIS

我正在尝试创建 SSIS 包,它会定期将数据发送到其他数据库。我只想发送新记录(我需要保留已发送的记录)所以我在源 table.

中创建了状态列

我希望我的包在成功发送数据后更新此列,但我无法更新具有 "unsent" 状态的所有行,因为在包执行期间可能添加了一些行,我也不能使用事务(我的意思是在隔离级别上可以解决我的问题:我不能使用 Serializable 因为我不能阻止用户添加新行,并且序列容器不支持快照)。

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

我认为我不应该设置状态 "to send" 然后将其更新为 "sent",我认为这会很昂贵。

现在我正在考虑使用临时 table,但我不确定这是正确的方法,我是否遗漏了什么?

记录集是一个目的地。您不能在数据流任务中使用它。 但是由于数据被保存到一个变量中,它可以在控制流中使用。

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

此外,看看 "Lookup Transform" 是否对您有用。您可以生成匹配或不匹配的行。

我会根据讨论改进答案

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

如果您还必须处理记录删除,它会变得更有趣。

我知道每天阅读和检查一周的价值似乎很浪费,但您的数据库应该几乎感觉不到,它提供了很多很好的双重检查,并通过提供简单的容错算法为您省去了很多麻烦。部分记录由于网络问题没有传输,不用担心,第二天会被提取。

我仍然会将 SSIS 包设置为服务器任务,它会向我发送一封包含任何错误的电子邮件,以便我进行跟踪。大多数日子里,您不会遇到任何错误,当出现错误时,您可以等待一天或解决问题,让接下来的几天 运行 解决问题。

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

  1. 我读入了所有状态为新的记录。
  2. 然后使用 OLE DB 命令 在每一行上执行 SQL,改变 状态为"In progress"(在你的where,输入一个?作为值 组件 属性 选项卡,您可以将其配置为参数 来自 table 行,例如列映射中的 ID 或某些 pk 选项卡)。
  3. 处理完记录后,您可以更改所有 "In Progress" 使用另一个 OLE DB 记录到 "Success" 或类似的东西 命令。

根据您的操作,您可以使用状态来标记在某个时刻出错的记录,并需要进一步关注。