LINKED服务器不返回所有行

问题描述 投票:6回答:2

这对我来说有点奇怪。我有脚本如下

DECLARE @maxCustId INT
SELECT @maxCustId = MAX(CustomerId) FROM Customers
SELECT * INTO #temp FROM linkserver.DB.dbo.Customers where CustomerId > @maxCustId 

-- Copy records to local db Custome table

DROP TABLE #temp

但有时#temp不会从链接服务器获取所有记录。

就像我在我的本地数据库中使用Max CustomerId = 1138一样,当我在脚本上运行时,我的临时表(从链接服务器获取记录)错过了CustoemrIds 1140, 1141。链接服务器有customers upto 1160#temp表有记录upto 1160但错过了两个记录,即1140, 1141

我一次又一次地运行该脚本,并在第四次尝试记录1141添加到#temp表但记录1140仍然缺失。

然后我在本地服务器上进行以下查询以检查链接服务器中的记录

SELECT * FROM linkserver.DB.dbo.Customers where CustomerId = 1140

上面的查询返回没有记录。

为了验证这一点,我去了链接服务器并在我创建LINKED服务器的服务器上写了相同的查询。

-- This is the server which I am using as linked server in my local server
SELECT * FROM Customers where CustomerId = 1140

Custoemr 1140在db中,我确信它会在那里,但我在脚本上运行以验证它。

我回到我的本地服务器并运行此查询

SELECT * FROM linkserver.DB.dbo.Customers where CustomerId = 1140

这次我的链接服务器返回它之前没有返回的customer 1140

我再次运行整个查询,现在我的#temp表有所有记录。

我很困惑,为什么第一次链接服务器没有返回所有记录。

这是一个长过程的示例,它将记录从链接服务器复制到本地服务器,因此我的本地数据库的记录少于链接服务器数据库。

  • 链接服务器:带有SP2的SQL Server 2005 Standard
  • 本地服务器:带有SP2的SQL Server 2008 Web Edition
  • 提供者:SQL Native Client 10

链接服务器安全选项:

  • 使用安全上下文制作
  • 远程登录
  • 用密码

登录用户详情:

  • 服务器角色:public和sysadmin
  • 用户映射:sa未使用db I查询进行映射。
  • 链接服务器db经常更新
  • 查询中的任何一点都没有NOLOCK

任何帮助。

sql sql-server sql-server-2005 tsql sql-server-2008
2个回答
1
投票

我已经看到了与链接服务器类似的行为(虽然通常是Oracle而不是SQL Server),问题可以追溯到用于链接服务器的驱动程序。我看到你有SQL Native Client 10作为提供程序,你可以尝试使用Microsoft OLE DB Provider for SQL Server,看看它是否有所作为?


-1
投票

当您使用OpenQuery而不是四部分命名约定时,也很想知道您是否遇到同样的问题:

SELECT * FROM OpenQuery(linkserver,'SELECT * FROM Customers where CustomerId = 1140') 

无论如何,IIRC应该更快......我相信这会强制它处理链接服务器上的“where”部分,只返回适当的值,而不是返回整个数据集并对其进行过滤。目的地方。当然,我也很确定我八岁的时候在奶奶的家里看到一个不明飞行物,所以带着我的智慧喝一粒盐。

© www.soinside.com 2019 - 2024. All rights reserved.