这对我来说有点奇怪。我有像下面这样的脚本
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表包含所有记录。
我很困惑,为什么第一次链接服务器没有返回所有记录。
这是一个长过程的示例,它将记录从链接服务器复制到本地服务器,因此我的本地数据库的记录少于链接服务器数据库。
链接服务器安全选项:
登录用户详细信息:
任何帮助。
答案 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 '在目的地一侧。当然,我也很确定我八岁的时候在奶奶的家里看到一个不明飞行物,所以带着我的智慧带着一丝盐。