Ошибка при вставке в связанный сервер
Я хочу вставить некоторые данные на локальном сервере на удаленный сервер и использовать следующий sql:
select * into linkservername.mydbname.dbo.test from localdbname.dbo.test
Но он выдает следующую ошибку
Имя объекта 'linkservername.mydbname.dbo.test' содержит больше максимального количества префиксов. Максимум равен 2.
Как я могу это сделать?
Ответы
Ответ 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';