Они делают разные вещи, в верхней вы ограничиваете удаление до 2000 строк, которые соответствуют критериям.Однако в нижней части вы ограничиваете выбор для возврата 2000 строк, несмотря на идентификатор продукта, а затем удаляете только те, где ProductID = @product_id
.Нижний обладает большей избирательностью и может удалять меньше строк.
DELETE FROM ProductOrderInfo
WHERE ProductId = @product_id AND FileNameCRC IN
(
-- Now if @count is 2000
-- You're guarentted *at most* 2000 rows
-- *none* of which are guaranteed to have `ProductId = @product_id`
SELECT TOP(@count) FileNameCRC
FROM ProductOrderInfo WITH (NOLOCK)
WHERE bCopied = 1 AND FileNameCRC = @localNameCrc
)