我想在本地服务器上将一些数据插入远程服务器,并使用以下sql:
select * into linkservername.mydbname.dbo.test from localdbname.dbo.test
但它会引发以下错误
对象名称“linkservername.mydbname.dbo.test”包含的前缀数量超过最大数量。最大值为2.
我该怎么做?
答案 0 :(得分:15)
我不认为使用INTO
子句创建的新表支持4个部件名称。
您需要先创建表,然后使用INSERT..SELECT
填充它。
(请参阅MSDN上的参数部分中的注释:reference)
答案 1 :(得分:11)
SELECT...INTO [new_table_name]
语句最多支持2个前缀:[database].[schema].[table]
注意:使用SELECT INTO
在链接中提取数据与使用INSERT INTO
推送数据相比更为高效:
SELECT INTO
记录最少。SELECT INTO
通常不会隐式启动分布式事务。我通常在第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';