插入链接服务器时出错

时间:2011-01-20 08:29:54

标签: sql-server insert linked-server

我想在本地服务器上将一些数据插入远程服务器,并使用以下sql:

select * into linkservername.mydbname.dbo.test from localdbname.dbo.test

但它会引发以下错误

  

对象名称“linkservername.mydbname.dbo.test”包含的前缀数量超过最大数量。最大值为2.

我该怎么做?

4 个答案:

答案 0 :(得分:15)

我不认为使用INTO子句创建的新表支持4个部件名称。 您需要先创建表,然后使用INSERT..SELECT填充它。

(请参阅MSDN上的参数部分中的注释:reference

答案 1 :(得分:11)

SELECT...INTO [new_table_name]语句最多支持2个前缀:[database].[schema].[table]

注意:使用SELECT INTO在链接中提取数据与使用INSERT INTO推送数据相比更为高效:

  1. SELECT INTO记录最少。
  2. SELECT INTO通常不会隐式启动分布式事务。
  3. 我通常在第2点说,因为在大多数情况下,使用SELECT INTO时不会隐式创建分布式事务。如果探查器跟踪告诉您SQL Server仍然隐式创建分布式事务,则可以先SELECT INTO临时表,以防止隐式分布式事务,然后将数据从临时表移动到目标表中。

    Push vs. Pull示例
    在此示例中,我们通过链接将数据从[server_a]复制到[server_b]。此示例假定可以从两个服务器执行查询:


    而不是连接到[server_a]并将数据推送到[server_b]:

    INSERT INTO [server_b].[database].[schema].[table]
    SELECT * FROM [database].[schema].[table]
    


    连接到[server_b]并从[server_a]中提取数据:

    SELECT * INTO [database].[schema].[table]
    FROM [server_a].[database].[schema].[table]
    

答案 2 :(得分:1)

我可能聚会晚了,但这是我搜索链接服务器的第4部分表名称插入问题时看到的第一篇文章。在阅读了此文章和更多文章之后,我可以通过将EXEC与“ AT”参数一起使用(对于SQL2008 +)来实现此目的,以便从链接服务器运行查询。例如,我必须将4M记录插入到另一台服务器上的伪临时表中,并且执行INSERT-SELECT FROM语句要花费10多分钟。但是将其更改为下面的SELECT-INTO语句,该语句允许FROM子句中包含4部分表名,只需几秒钟即可完成(在我的情况下不到10秒)。

EXEC ('USE MyDatabase;  
BEGIN TRY DROP TABLE TempID3 END TRY BEGIN CATCH END CATCH; 
SELECT Field1, Field2, Field3 
INTO TempID3 
FROM SourceServer.SourceDatabase.dbo.SourceTable;') AT [DestinationServer]
GO

查询在DestinationServer上运行,更改为正确的数据库,确保该表不存在,然后从SourceServer中进行选择。最少记录,没有大惊小怪。这些信息可能已经在某个地方了,但是我希望它可以帮助任何搜索类似问题的人。

答案 3 :(得分:0)

在过去的一个小时里,我一直在努力。 我现在意识到使用语法

SELECT orderid, orderdate, empid, custid
INTO [linkedserver].[database].[dbo].[table]
FROM Sales.Orders;

不适用于链接服务器。您必须首先进入链接服务器并手动创建表,然后使用以下语法:

INSERT INTO [linkedserver].[database].[dbo].[table]
SELECT orderid, orderdate, empid, custid
FROM Sales.Orders
WHERE shipcountry = 'UK';