2015-12-10 2 views
-2

Я имею следующую хранимую процедуру внутри стороннего приложения внутри SQL Server 2008 R2: -Почему эта хранимая процедура использует ТОП 100 ПРОЦЕНТ?

ALTER PROCEDURE [dbo].[GetContacts] 
AS 
BEGIN 

--------- 
SELECT  TOP (100) PERCENT ..... 
INTO   [#temp200] 
FROM   dbo.Contact 

ORDER BY dbo.Contact.Name 

--SELECT * from #temp200 

SELECT top 38 * 
FROM   #temp200 
ORDER BY Fullname 

delete top (38) FROM   #temp200 

SELECT top 38 * 
FROM   #temp200 
ORDER BY Fullname 

delete top (38) FROM   #temp200 

SELECT top 38 * 
FROM   #temp200 
ORDER BY Fullname 

delete top (38) FROM   #temp200 

SELECT * 
FROM   #temp200 
ORDER BY Fullname 

Теперь я бегу это внутри студии управления SQL, где я получил следующие результаты вкладки: -

  1. первый содержит 38 записей.

  2. второй 38 записей.

  3. третья содержит 38 записей.

  4. четвертый содержит 30 записей.

, где в данном случае я получил 144 записей ,, так что не уверен, что цель (SELECT TOP (100)), как я буду получать 144 записей. теперь в качестве теста я изменил Select TOP(100) на Select TOP(35), где в этом случае я получил 2 результата; первый из которых содержит 38 записей, а второй - 17 записей и ... так может ли кто-нибудь посоветовать, как работает мой выше SP?

+2

Уверены, что у вас нет 'SELECT TOP (100) PERCENT ..... INTO [# temp200] FROM ...'? Если да, вы создаете таблицу '# temp200' со всеми записями из' contact' (144?) – lad2025

+0

В любом случае подготовьте http://sqlfiddle.com, чтобы воссоздать ваш случай – lad2025

+0

Я никогда не видел ничего подобного. Это плохая попытка пейджинга 38 записей на страницу с лимитом в 4 страницы? Я также не понимаю, почему есть вершина (100), если она будет на 100% выше. Как возможно, вы получите больше записей, чем то, что вы вставили в таблицу. Я подозреваю, что нам не хватает частей этого запроса. – ewahner

ответ

2

Этот парень не понимал, что в таблицах нет порядка. Он попытался вставить упорядоченным способом в временные таблицы. Это невозможно. TOP 100 PERCENT трюк закрывает предупреждение об этом, но ничего не делает для обеспечения порядка.

В более ранних версиях SQL Server этот код мог бы работать по совпадению. С тех пор добавлено больше оптимизаций, и этот код чрезвычайно хрупкий. Перепишите это, если у вас есть шанс. Это латентная бомба замедленного действия.

Смежные вопросы