Будет ли TOP всегда возвращать одинаковые строки - PullRequest
2 голосов
/ 12 апреля 2011

Я написал некоторый код для перемещения данных в архивную таблицу, по 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 Ответ

5 голосов
/ 12 апреля 2011

Поскольку вы используете их no, они не будут гарантированно возвращать те же строки.

Почему?Потому что вы не указываете предложение order by.Это будет просто 1000 записей, которые двигатель сочтет «лучшими» в то время.

Также обратите внимание, что возможно, даже если вы укажете order by, вы все равно не получите те же 1000строки ... если ваш заказ по недостаточно избирателен, чтобы на границе 1000-го элемента был определенный, определяемый порядок.

Например;если в верхней части есть 1002 элемента с одинаковым отсортированным значением, вы не знаете, какие из 2 не будут включены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...