ошибка при вставке на связанный сервер - PullRequest
12 голосов
/ 20 января 2011

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

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

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

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

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

Ответы [ 5 ]

15 голосов
/ 20 января 2011

Я не думаю, что новая таблица, созданная с помощью предложения INTO, поддерживает 4 имени части.Сначала вам нужно будет создать таблицу, а затем использовать INSERT..SELECT для ее заполнения.

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

11 голосов
/ 04 апреля 2013

Оператор 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 временную таблицу, чтобы предотвратить неявную распределенную транзакцию, а затем переместить данные в целевую таблицу из временной таблицы.

Пример «Push vs. Pull»
В этом примере мы копируем данные из [server_a] в [server_b] по ссылке.В этом примере предполагается, что выполнение запроса возможно с обоих серверов:

Push
Вместо подключения к [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]
1 голос
/ 09 августа 2018

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

1 голос
/ 23 ноября 2015

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

0 голосов
/ 29 декабря 2017

Я боролся с этим в течение последнего часа. Теперь я понимаю, что с помощью синтаксиса

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...