使用top子句从链接服务器更新临时表

时间:2012-02-09 00:47:26

标签: sql sql-server sql-server-2008 sql-server-2005 linked-server

我正在尝试使用top子句从链接服务器更新#temp表但是得到了一个非常奇怪的结果 - 它似乎忽略了我的代码中的顺序。

我可以以编程方式修复特定问题,但想知道这是否是一次性问题,或者我将链接服务器的方式存在一般性问题。

查询正在2005 SQL Server(9.0.3042)上运行,该链接到通过Microsoft OLE DB Provider for SQL Server链接的2008 SQL Server R2(10.50.279)。

查询看起来像这样 - 我已经创建了#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时,它工作正常。
  • 当我使用Max而不是Top时,它可以正常工作。
  • 当我通过链接(同一提供商)在2008 SQL Server上运行完全相同的查询/方案回到2005 SQL Server时,它运行正常

我不是在寻找针对这个特定查询的修复方法,但是想知道这是一个孤立的问题还是2005年到2008年的一些基本问题,这些问题很难在很难找到的方面表现出来。

谢谢, 添

1 个答案:

答案 0 :(得分: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-更新语句

相关问题