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 - 更新声明