LINKED服务器不返回所有行

时间:2011-03-16 14:52:54

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

这对我来说有点奇怪。我有像下面这样的脚本

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

我一次又一次地运行该脚本,第4次尝试在#temp表中添加记录1141,但记录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表包含所有记录。

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

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

  • 链接服务器:SQL Server 2005 Standard SP2(
  • 本地服务器:带SP2的SQL Server 2008网络版
  • 提供商: SQL Native Client 10

链接服务器安全选项:

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

登录用户详细信息:

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

任何帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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

SELECT * FROM OpenQuery(linkserver,'SELECT * FROM Customers where CustomerId = 1140') 
IIRC,那应该更快,无论如何......我相信这将迫使它处理链接服务器上的“where”部分并且仅返回适当的值而不是返回整个数据集并执行filterin '在目的地一侧。当然,我也很确定我八岁的时候在奶奶的家里看到一个不明飞行物,所以带着我的智慧带着一丝盐。