我正在尝试使用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子句。
我不是在寻找针对这个特定查询的修复方法,但是想知道这是一个孤立的问题还是2005年到2008年的一些基本问题,这些问题很难在很难找到的方面表现出来。
谢谢, 添
答案 0 :(得分:0)
我有一些坏消息。我在这里复制了这个问题。它在我看来是SQL Server 2005的查询计划的问题(我使用更高版本测试,v 9.0.4035):
Image: Query plan for update statement
(对不起,我不能在这里嵌入图片,没有足够的声誉)
该远程查询的详细信息:
没有向远程服务器发送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-更新语句