这对我来说有点奇怪。我有脚本如下
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表有所有记录。
我很困惑,为什么第一次链接服务器没有返回所有记录。
这是一个长过程的示例,它将记录从链接服务器复制到本地服务器,因此我的本地数据库的记录少于链接服务器数据库。
链接服务器安全选项:
登录用户详情:
任何帮助。
我已经看到了与链接服务器类似的行为(虽然通常是Oracle而不是SQL Server),问题可以追溯到用于链接服务器的驱动程序。我看到你有SQL Native Client 10作为提供程序,你可以尝试使用Microsoft OLE DB Provider for SQL Server,看看它是否有所作为?
当您使用OpenQuery而不是四部分命名约定时,也很想知道您是否遇到同样的问题:
SELECT * FROM OpenQuery(linkserver,'SELECT * FROM Customers where CustomerId = 1140')
无论如何,IIRC应该更快......我相信这会强制它处理链接服务器上的“where”部分,只返回适当的值,而不是返回整个数据集并对其进行过滤。目的地方。当然,我也很确定我八岁的时候在奶奶的家里看到一个不明飞行物,所以带着我的智慧喝一粒盐。