我们过去使用的另一种方法是使用我们要移动的主键创建一个临时表并使用 while 循环。通过这种方式,您可以以一种块方式执行此操作,这样您就可以避免在取消并且必须回滚时产生大量事务开销。
基本上你最终要做的是插入表名(...)从表名中选择(...),其中主键在(从临时表中选择前 10000 个键)
您想要在辅助结果集中的前 10000 个,以便您可以将它们从临时表中删除,这样它们就不会再次被处理。
另一种方法是使用游标来减少一次处理的记录数。
另一种循环方法是在 while 循环中执行类似的操作。
将 @stop 声明为 int set @stop = (select count(primaryKey) from tableName where primaryKey not in destinationtable)
while (@stop > 0) 开始事务
插入destinationTable (...) select (...) from sourcetable where primaryKey not in (select primarykey from destinationtable)
犯罪
set @stop = (select count(primaryKey) from tableName where primaryKey not in destinationtable) end
不是最有效的,但它会起作用,并且应该允许您保留事务日志。除非您需要它,否则请确保使用 no lock 关键字,以便在执行此大型移动时不会阻止其他事务(除非您使用 BCP 或 DTS,因为它们要快得多)。
不过,有些话可能是你最好的选择。使用 BCP、DTS 或其他一些批量工具。如果您可以删除索引,它将使事情进展得更快。