【问题标题】:error when insert into linked server插入链接服务器时出错
【发布时间】:2011-01-20 08:29:53
【问题描述】:

我想将本地服务器上的一些数据插入到远程服务器中,使用了如下sql:

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

但它会引发以下错误

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

我该怎么做?

【问题讨论】:

    标签: sql-server insert linked-server


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      注意:使用SELECT INTO 通过链接拉取数据比使用INSERT INTO 推送数据更高效:

      1. SELECT INTO 的日志记录最少。
      2. SELECT INTO 通常不会隐式启动分布式事务。

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

      推送与拉取示例
      在此示例中,我们通过链接将数据从 [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]
      

      【讨论】:

        【解决方案3】:

        过去一个小时我一直在为此苦苦挣扎。 我现在意识到使用语法

        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';
        

        【讨论】:

          【解决方案4】:

          我遇到了同样的问题,我执行了以下解决方法: 如果您能够登录到要使用 MSSQL 或 sqlcmd 插入数据的远程服务器并重建查询,反之亦然:

          所以来自:

          SELECT * INTO linkservername.mydbname.dbo.test 
          FROM localdbname.dbo.test
          

          到以下:

          SELECT * INTO localdbname.dbo.test
          FROM linkservername.mydbname.dbo.test
          

          在我的情况下效果很好。

          @2Toad:肯定 INSERT INTO 更好/更有效。然而,对于小型查询和快速操作,SELECT * INTO 更加灵活,因为它会即时创建表并立即插入数据,而 INSERT INTO 需要在执行之前创建表(自动识别选项等)插入操作。

          【讨论】:

            【解决方案5】:

            我可能迟到了,但这是我在搜索链接服务器的 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 中进行选择。最少登录,没有大惊小怪。这些信息可能已经在某个地方,但我希望它可以帮助任何搜索类似问题的人。

            【讨论】:

            • 我已经这样做了太多年了,不能说这是我第一次看到这个“目标服务器”;但是,谢谢! ..它只是救了我的---。谢谢@BlueGI!
            • 还需要确保链接服务器使用的任何用户/安全上下文对目标服务器和数据库都具有适当的权限。还需要确保链接服务器也启用了 RFC 输入和输出。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多