Как копировать данные из БД на одном сервере SQL в БД на другом сервере SQL? - PullRequest
1 голос
/ 02 мая 2019

Я не пытаюсь сделать прямую копию данных с одного сервера на другой. Я должен очистить / переименовать исходные данные, прежде чем вставлять их в целевую БД, и проверить, существуют ли значения в различных справочных таблицах, и вставить их, если их нет.

В основном как-то так:

SELECT EmployeeID, FirstName, LastName, Region
INTO #Temp
FROM server1.db1.dbo.Employees

INSERT INTO server2.db2.dbo.Region
(Region)
SELECT DISTINCT Region FROM #Temp
WHERE Region NOT IN (SELECT Region FROM server2.db2.dbo.Region)

INSERT INTO server2.db2.dbo.Employees
(EmployeeID, FullName, Region)
SELECT EmployeeID, FirstName + ' ' + LastName AS FullName, Region FROM #Temp

DROP TABLE #Temp

Однако использование полного имени, например serverName.DBname.DBTable, похоже, не работает.

Я использую SQL Server 2012.

РЕДАКТИРОВАТЬ - Я не верю, что смогу заставить клиента создать связанный сервер согласно https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addlinkedserver-transact-sql?view=sql-server-2017.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Другой вариант - использовать SSIS.

  1. Создание диспетчеров соединений для каждого сервера
  2. Создание задачи потока данных.
  3. Добавление источников и назначений в задачи потока данных для каждой таблицы.
  4. Поместите ваши запросы преобразования в источники, подключенные к вашему исходному серверу.
  5. Сопоставьте столбцы в пунктах назначения, подключенных к серверу назначения.
  6. Выполнить пакет.
  7. Боб твой дядя.

Это также предполагает, что у вас есть права на оба поля, но вам не нужно просить что-то от вашего клиента, чтобы сделать это.

0 голосов
/ 02 мая 2019

Если вы не можете настроить связанный сервер (что я рекомендую вам сделать), вы можете использовать OPENROWSET.Это предполагает , что у вас есть учетная запись AD в обоих случаях с соответствующими разрешениями.Вам также нужно будет подключиться к экземпляру, в который вы хотите вставить данные, а не к серверу, с которого поступают данные.Это должно дать вам идею:

USE db2;
GO

INSERT INTO dbo.Employees (EmployeeID, FullName, Region)
SELECT EmployeeID, FirstName + ' ' + LastName AS FullName, Region
FROM OPENROWSET('SQLNCLI','SERVER=server2;Trusted_Connection=yes',
                N'SELECT EmployeeID, FirstName, LastName, Region FROM db1.dbo.Employees');

Если у вас нет логина AD для обоих, вам нужно вместо этого использовать аутентификацию SQL.если это не вариант, то вам придется полностью пойти другим путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...