Запрос выполняется на DestinationServer, изменяется на нужную базу данных, гарантирует, что таблица еще не существует, и выбирает из SourceServer. Минимально вошли и без суеты. Эта информация, возможно, уже где-то есть, но я надеюсь, что она поможет любому, кто ищет похожие проблемы.

у вставить некоторые данные на локальном сервере в удаленный сервер, и использовал следующий sql:

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

Но это выдает следующую ошибку

Имя объекта 'linkservername.mydbname.dbo.test' содержит больше максимального числа префиксов. Максимум 2.

Как я могу это сделать?

Ответы на вопрос(5)

SELECT...INTO [new_table_name] оператор поддерживает максимум 2 префикса:[database].[schema].[table]

ПРИМЕЧАНИЕ: более эффективно перетаскивать данные по ссылке, используяSELECT INTO против проталкивания с помощьюINSERT INTO:

SELECT INTO минимально зарегистрирован.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]

если вы можете войти на удаленный сервер, на который хотите вставить данные с помощью 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 требует создания таблицы (параметры автоматической идентификации и т. Д.) Перед выполнением вставить операцию.

я опоздал на вечеринку, но это был первый пост, который я увидел, когда искал проблему вставки имени таблицы из 4 частей на связанный сервер. Прочитав это и еще несколько постов, я смог сделать это, используяEXEC с аргументом «AT» (для SQL2008 +), чтобы запрос запускался со связанного сервера. Например, мне пришлось вставить записи 4M в псевдо-временную таблицу на другом сервере, и выполнение инструкции INSERT-SELECT FROM заняло более 10 минут. Но, изменив его на следующий оператор SELECT-INTO, который позволяет использовать имя таблицы из 4 частей в предложении FROM, он делает это всего за несколько секунд (в моем случае - менее 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. Минимально вошли и без суеты. Эта информация, возможно, уже где-то есть, но я надеюсь, что она поможет любому, кто ищет похожие проблемы.

Решение Вопроса

INTO Предложение поддерживает 4 части имен. Вам нужно будет сначала создать таблицу, а затем использоватьINSERT..SELECT заселить это.

(См. Примечание в разделе «Аргументы» в MSDN:ссылка)

 richaux27 мая 2016 г., 11:53
спасибо, ссылка исправлена
 ketura26 мая 2016 г., 16:47
Ссылка не работает.

что с помощью синтаксиса

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

Ваш ответ на вопрос