我编写了一些代码来将数据移动到一个存档表中,一次1000行(SQL Server 2008 R2):
-- archive data
while (@QuitLoop = 0)
begin
begin transaction
insert into MyTransactionTable (...)
select top 1000 * from MyTransactionTable where DateOfSale < @ArchiveCutOffDate
delete top 1000 from MyTransactionTable where DateOfSale < @ArchiveCutOffDate
if (@@rowcount = 0) select @QuitLoop = 1
commit transaction
end
top会不会返回相同的1000行?
因此,插入到归档表中的行与从事务表中删除的行相同。
答案 0 :(得分:5)
当你使用它们时,它们将不保证返回相同的行。
为什么呢?因为您没有指定order by
子句。它只是引擎决定的1000条记录是时间周围的“顶级”记录。
另请注意,即使您指定order by
仍然不会获得相同的1000行,也可能...如果您的订单不够有选择性,那么在第1000项的边框上是具体的,可定义的命令。
例如;如果在顶部有1002个具有相同排序值的项目,则您不知道哪个2 不包含在内。