为什么不同版本的链接服务器的查询结果完全错误?

时间:2014-08-06 16:14:27

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

我有一个运行存储过程的SQL Server 2005,它会运行其他运行2008的服务器。

非常简单的查询会返回完全不正确的结果。

SELECT 
   c.acctno, c.provcode, p.provcode, p.provname, c.poscode AS ChargePOS, 
   pos.poscode, pos.posdesc
FROM
   Server2008.charge_t as c
inner join 
   Server2008.provcode_t as p on c.provcode = p.provcode
inner join 
   Server2008.poscode_t as pos on c.poscode = pos.poscode
inner join 
   Server2008.patdemo_t as pat on c.acctno = pat.acctno
left join 
   Server2008.billareacode_t as b on c.billingarea = b.billareacode
Where 
   c.proccode in ('G0438', 'G0439', '99420')
   and c.correction = 'N' 
   and (c.priinscode in ('0001', '001A', '001B')
         or c.secinscode in ('0001', '001A', '001B'))
   and year(c.dateofservice) = year(getdate())

请注意INNER JOINposcode_tcharge_t表(第二个内部联接)c.poscode = pos.poscode acctno | patlname | patfname | ChargeProv | ProvProv | provname | ChargePOS | poscode | posdesc --------------------------------------------------------------------------------------------------------------------------------------------------------- 1 | person1 | Person1 | 28 | 28 | Doctor28 | 07 | 323 | Site323 2 | person2 | person2 | 24 | 24 | Doctor24 | 07 | 323 | Site323 。这是非常简单的标准内容。

在2005服务器上执行此操作时,结果是错误的。我得到以下内容:

{{1}}

在这两个例子中,ChargePOS(07)和poscode(323)显然不一样,连接应该确保它们是。

当我在Server2008上运行此查询时,结果是正确的。当我在2012服务器上运行它时,结果是正确的。只有当我在2005服务器上运行它时才会这样。我使用的SSMS版本没有区别。

我已经打破了查询,逐个添加一个连接。如果我在WHERE中指定了一个acctno,结果是正确的。

有没有人见过这样的东西?它就像链接本身很糟糕,或者在挂起的交易中存在某种垃圾,只是在这台服务器上搞乱了。任何想看的地方都有帮助。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

这不是整个问题的解决方案,但我发现了一些影响结果的事情。

  1. 在2005服务器上运行连接时,将连接更改为LEFT可以解决问题。
  2. 添加提示OPTION(MERGE JOIN)也会对其进行更正。
  3. 这些都没有解释为什么它在所有其他服务器上正常运行但在这一台服务器上可怕的错误。将连接更改为LEFT并未改变执行计划的结构,但添加了提示。

    我们需要引进专家,因为在这种情况下解决问题是不可接受的。我仍然欢迎任何关于这里可能发生的事情的想法。