SQL Server - 从上次更新的行恢复游标

时间:2014-04-28 12:39:28

标签: sql sql-server

我需要对表格进行游标更新(数百万行)。如果脚本将再次启动(例如,在服务器重新启动的情况下),脚本应该从上次更新的行恢复。

解决此问题的最佳方法是什么?使用上次保存的ID创建一个新表?使用表扩展属性来保存此信息?

1 个答案:

答案 0 :(得分:0)

我会添加" UpdateDate"或" LastProcessDate"或者一些类似命名的日期时间列到您的表并使用它。运行更新时,只需处理不是最大UpdateDate或为空的任意数量的记录:

where UpdateDate < (select max(UpdateDate) from MyTable) or UpdateDate is null

在进程/循环开始时获取最大UpdateDate(@maxUpdateDate?)可能是一个好主意,因此它在批处理期间不会发生变化,同样会获得一个新的UpdateDate({ {1}}?)在流程开始时随时更新每一行。 UTC日期最适合避免DST时间变化。

此数据现在是您实体的真实属性,而不是元数据或临时占位符,这似乎是事务一致性和完全ACID的最佳方式。它也比其他方法更自我记录,并且可以在需要时编入索引。日期还可以包含有关数据的重要时态信息,而ID和标志则不包含。

以这种方式执行此操作会使存储其他表或扩展属性的数据变得多余。

其他一些想法:

  • 不要使用临时表,在您尚未处理所有行(连接丢失,服务器重启等)的情况下,临时表可能会消失。
  • 不要使用可以填补空白,重新接种,截断为0等的身份或其他ID。
  • 将最大值存储在另一个表中(基本上是滚动自己的序列对象)的想法一般都不受欢迎,并且从我读过的内容中可以看出是一个可疑的SQL Server实践,尽管我已经#39 ;我现在很难找到一篇好文章。
  • 如果可能的话,避免使用游标支持批处理,并且通常避免使用批处理来支持基于完整集的更新。
  • @newUpdateDate似乎在回滚时看起来行为正确,但我不确定锁定是如何工作的 - 如果您最终决定沿着这条路走下去,那就是FYI。