2015-12-10 72 views
-2

我的SQL Server 2008 R2中第三方應用程序中以下存儲過程: -爲什麼這個存儲過程使用TOP 100 PERCENT?

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'所有記錄從'聯繫'(144?) – lad2025

+0

無論如何準備http://sqlfiddle.com重新創建你的情況 – lad2025

+0

我從來沒有見過這樣的事情。這是一個糟糕的嘗試每頁分頁38條記錄,限制4頁?我也不明白爲什麼有一個頂級(100),如果它將成爲100%的頂部。你怎麼可能得到比你插入表格更多的記錄。我懷疑我們缺少這個查詢的一部分。 – ewahner

回答

2

那傢伙不明白表格沒有順序。他試圖以有序的方式插入臨時表。這不可能。 TOP 100 PERCENT技巧關閉了這個警告,但沒有做任何事情來確保秩序。

在較早的SQL Server版本中,該代碼很可能巧合運行。從那時起,更多的優化被添加了,並且這個代碼非常脆弱。如果你有機會重寫這個。這是一個潛在的定時炸彈。

相關問題