SQL查询在链接服务器上给出错误结果

时间:2009-02-09 15:12:16

标签: sql sql-server

我正在尝试从2个表中提取用户数据,一个在本地,一个在链接服务器上,但在查询远程服务器时,我得到了错误的结果。

我已将查询缩减为

select * from SQL2.USER.dbo.people where persId = 475785

进行测试,发现当我运行它时,即使我知道这个人存在,我也没有得到任何结果。 (persId是一个整数,db是SQL Server 2000,顺便说一下dbo.people是一个表)

如果我复制/粘贴查询并在与数据库相同的服务器上运行它,那么它可以工作。

它似乎只会影响某些用户ID,例如运行

select * from SQL2.USER.dbo.people where persId = 475784

在我想要之前为用户工作正常。

奇怪的是我发现了

select * from SQL2.USER.dbo.people where persId like '475785'

也可以,但

select * from SQL2.USER.dbo.people where persId > 475784

带回来的记录,其中persIds从22519开始,而不是像我期望的那样475785。

希望对某人有意义

有什么想法吗?

更新: 由于内部关注对live people表进行任何更改,我暂时移动了我的数据库,因此它们都在同一台服务器上,因此链接服务器问题不适用。一旦整批货物迁移到一个单独的集群,我就能够正确调查。一旦发生这种情况,我会更新更新,我可以通过所有建议。谢谢你的帮助。

5 个答案:

答案 0 :(得分:1)

LIKE操作的事实不是一个主要线索:LIKE强制整数字符串(所以你可以说WHERE字段LIKE'2%'并且你将得到所有以2开头的记录,即使字段是整数类型)。您的错误比较会让我认为您的索引已损坏,但您说它们在未通过链接使用时有效...但是,根据使用情况,所选索引可能会有所不同? (我似乎记得一个实例,当我有重复的索引,只有一个是陈旧的,虽然那是很久以前回想起确切的原因)。

尽管如此,我会尝试使用DBCC DBREINDEX(tablenname)命令重建索引。如果事实证明这样做会修复您的查询,您可能希望重建它们:here is a script以便轻松地重建它们。

答案 1 :(得分:1)

dbo.people是桌子还是视图?我已经看到类似的地方已经更改了基础表模式,并且删除和重新创建视图修复了问题,尽管如果直接在链接服务器上运行查询的工作确实表明某些基于索引...

答案 2 :(得分:0)

我会检查以下内容:

  • 检查链接服务器上的定义,并确认SQL2是 你期望它的服务器
  • 检查并比较远程服务器和本地服务器的执行计划
  • 尝试通过IP地址而不是名称进行链接,以确保您拥有正确的计算机
  • 将代码放入远程计算机上的存储过程中,然后尝试调用

答案 3 :(得分:0)

对我来说听起来像个错误 - 我已经读过这些问题,btu不记得具体是什么。你在运行什么版本的SQL Server?

select * from SQL2.USER.dbo.people where persId = 475785

对于PersID如何失败:

SELECT *
FROM OpenQuery(SQL2, 'SELECT * FROM USER.dbo.people WHERE persId = 475785')

表现?

答案 4 :(得分:0)

链接服务器是否使用相同的排序规则?根据所使用的索引,如果服务器 collat​​ion兼容,我可能会看到类似这样的事情,但链接服务器设置 collat​​ion兼容(告诉Sql)它可以在远程服务器上运行查询服务器。)