Подтвердить что ты не робот

Ошибка при вставке в связанный сервер

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

  • SELECT INTO минимально зарегистрирован.
  • SELECT INTO неявно запускает распределенную транзакцию, как правило.

Я говорю, как правило, в пункте №2, потому что в большинстве сценариев распределенная транзакция не создается неявно при использовании SELECT INTO. Если трассировка профилировщика говорит вам, что SQL Server по-прежнему неявно создает распределенную транзакцию, вы можете сначала SELECT INTO создать временную таблицу, чтобы предотвратить неявную распределенную транзакцию, а затем переместить данные в целевую таблицу из таблицы temp.

Пример Push to 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]

Ответ 3

У меня возникла одна и та же проблема, и я выполнил следующее обходное решение: Если вы можете войти на удаленный сервер, где вы хотите вставить данные с помощью 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

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

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