TOP总是会返回相同的行

Cra*_* HB 2 sql sql-server sql-server-2008

我编写了一些代码将数据移动到一个存档表中,一次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 
Run Code Online (Sandbox Code Playgroud)

top会不会返回相同的1000行?

因此,插入到归档表中的行与从事务表中删除的行相同.

And*_*ber 5

由于您没有使用它们,因此无法保证它们返回相同的行.

为什么?因为您没有指定order by子句.它只是引擎决定的1000条记录,是时间周围的"顶级"记录.

另请注意,即使您指定了order by仍然不会获得相同的1000行,也可能...如果您的订单不够有选择性,那么在第1000项的边界上是特定的,可定义的订单.

例如; 如果在顶部有1002个具有相同排序值的项目,则您不知道哪个项目包括在内.