TOP总是会返回相同的行

时间:2011-04-12 09:52:57

标签: 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 

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

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

1 个答案:

答案 0 :(得分:5)

当你使用它们时,它们将保证返回相同的行。

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

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

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