0

我想從鏈接服務器使用top子句更新#temp表,但得到一個非常奇怪的結果 - 它似乎忽略了在我的代碼中的順序。使用top clasue從鏈接服務器更新臨時表

我可以通過編程方式解決特定問題,但想知道這是否是一次性問題,或者是否存在關聯服務器的常見問題。

查詢正在鏈接到通過SQL Server的Microsoft OLE DB提供程序鏈接的2008 SQL Server R2(10.50.279)的2005 SQL Server(9.0.3042)上運行。

查詢看起來像這樣 - 我已經創建了#TempTable,它具有Id,Date和PrevDate列,並將數據插入Id和Date列。

update #TempTable 
set PrevDate =  
(select top 1 
    d.Date 
from 
    linkedserver.DB.dbo.Date as d 
where 
    d.Id = #TempTable.Id 
    and d.Date < #TempTable.Date 
order by 
    d.Date desc) 

的選擇不接頂1,這似乎是撿輸入到表中的特定ID的第一次約會,而忽略order by子句。

  • 我只是做一個選擇,它工作正常
  • 當我把在PrevDate通過inital插入,它工作正常。
  • 當我使用Max而不是Top時,它工作正常。
  • 當我通過一個鏈接運行SQL 2008服務器上的完全相同的查詢/場景(同一服務提供商)回到2005年的SQL Server,它工作正常

我不是在尋找修復這個特定查詢,但想知道這是否是一個孤立的事實或2005年至2008年的一些基本問題,這些問題將很難找到方法。

感謝, 添

+0

我同意@Tim,我很驚訝,這不起作用。運行執行計劃的任何洞察力?您可能會在TOP發生後發現訂單。我可能會運行TOP和MAX語法的執行計劃,以查看是否有顯着差異。 – sisdog 2012-02-13 06:07:59

回答

0

我有一些壞消息。我在這裏複製了這個問題。在我看來是與SQL Server 2005的查詢計劃的問題(我用最新版本的測試過,V 9.0.4035):

Image: Query plan for update statement

(抱歉,我不能在這裏嵌入圖像,沒有足夠的口碑)

對於遠程查詢詳情:

Image: Remote Query details

沒有ORDER BY發送到遠程服務器的語句,所以回來的結果確實只是TOP (1)以任意順序排列,這可能是按照主鍵的順序。在我看來,SQL Server應該在那裏發射了一個ORDER BY Date desc

因此,我不得不得出結論,在這種環境下,像這樣的其他查詢可能很容易出現相同的問題(所以,不是孤立的事件)。

順便說一下,從2009年開始,這個問題已經引發了Microsoft Connect問題:connect.microsoft.com/SQLServer/feedback/details/446017/missing-order-by-in-remote-query-with - 更新聲明