Обновить данные из таблиц на разных серверах - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть 2 таблицы Таблицы сотрудников и отделов

Сотрудники : (SQL Server)

EmpID EmpName DOJ
1      Mohan      NULL
2      Manasa     NULL

Отдел : (Teradata)

DepID     DepName EmpName        DOJ
1        Maths    Mohan K       2017-08-01
2        English  Mohan Kumar 2018-08-01
3        Science  Manasa K    2016-08-01
1        Social   Manasa       2017-09-01

Где мне нужно обновить таблицу Employee Дата присоединения столбца с использованием таблицы Department.Мне нужно получить последнюю дату присоединения на основе условия MAX и использовать условие LIKE с использованием служб SSIS.

Изначально я использовал EXECUTE SQL TASK и отправлял FULL RESULT SET через переменную и помещал этот SQL TASK в ForКаждый контейнер цикла

И необходимо обновить в таблице Employee, как показано ниже:

EmpID  EmpName   DOJ
1         Mohan   2018-08-01
2         Manasa  2017-09-01

Я использовал

  • ВЫПОЛНИТЬ ЗАДАЧУ SQL : Где я написал запрос SELECT EMPNAME FROM EMPLOYEE и дал полный набор результатов и сохранил в переменной
  • FOR EACH LOOP CONTAINER : использовал ADO.ENUMERATOR и использовал эту переменную.

Пожалуйста, предложите способ достижения этого

Таблица сотрудников - из SQL Server, а таблица Department - Teradata

1 Ответ

0 голосов
/ 05 февраля 2019

(1) Если источник и назначение находятся на одном и том же сервере

Я думаю, что вы можете достичь этого, используя задачу «Выполнение SQL» без контейнера цикла по каждому элементу:

(a) Employee.EmpName= Department.EmpName

With CTE_1 AS (SELECT EmpName  , MAX(DOJ) as mx FROM Department GROUP BY EmpName) 
    UPDATE T1
    SET T1.DOJ = CTE_1.mx
    FROM Employee T1 INNER JOIN CTE_1 ON CTE_1 EmpName = T1.EmpName;

(b) Employee.EmpName = Department.FirstName

Если таблица Department содержит полное имя, а таблица Employee содержит только имя, следует использовать следующий запрос:

With CTE_1 AS (CASE WHEN CHARINDEX(' ', EmpName) > 0
               THEN SUBSTRING(EmpName, 1, LEN(EmpName) - CHARINDEX(' ', REVERSE(EmpName)))
               ELSE EmpName END AS   EmpName  
     , MAX(DOJ) as mx FROM Department GROUP BY CASE WHEN CHARINDEX(' ', EmpName) > 0
               THEN SUBSTRING(EmpName, 1, LEN(EmpName) - CHARINDEX(' ', REVERSE(EmpName)))
               ELSE EmpName END) 
    UPDATE T1
    SET T1.DOJ = CTE_1.mx
    FROM Employee T1 INNER JOIN CTE_1 ON CTE_1 EmpName = T1.EmpName;

(c) Department.FirstName Начинается с Employee.EmpName

Или, если вы хотите присоединиться, используя условие с начальным условием, которое является менее точным:

With CTE_1 AS (SELECT EmpName  , MAX(DOJ) as mx FROM Department GROUP BY EmpName) 
    UPDATE T1
    SET T1.DOJ = CTE_1.mx
    FROM Employee T1 INNER JOIN CTE_1 ON CTE_1 EmpName LIKE T1.EmpName + '%';

(2) Если источник и место назначения находятся на разных серверах

(a) Создание связанного сервера в SQL SERVER Management Studio

Я думаю, что самый простой способ - это создать связанный сервер в SSMS или T-SQL для базы данных Teradata и выполнить указанные выше запросы.

(b) Использовать промежуточную таблицу

Другой способ,это импортировать таблицу отдела ввременной таблицы в SQL Server, а затем выполните один из указанных выше запросов.

(c) Используйте поиск с командой OLEDB

Если у вас нет прав для создания связанного сервера или дляимпортировать данные во временную таблицу, вы можете получить источник OLE DB из таблицы отдела с помощью аналогичной команды:

SELECT CASE WHEN CHARINDEX(' ', EmpName) > 0
           THEN SUBSTRING(EmpName, 1, LEN(EmpName) - CHARINDEX(' ', REVERSE(EmpName)))
           ELSE EmpName END AS   EmpName  
 , MAX(DOJ) as mx FROM Department GROUP BY CASE WHEN CHARINDEX(' ', EmpName) > 0
           THEN SUBSTRING(EmpName, 1, LEN(EmpName) - CHARINDEX(' ', REVERSE(EmpName))) ELSE EmpName END From Department

и использовать команду OLEDB COMMAND (соединение с SQL Server) для выполнения обновленияОперации строка за строкой, используя аналогичную команду:

Update Employee SET DOJ = ? WHERE EmpName = ?

И на вкладке Сопоставления столбцов сопоставьте столбец DOJ с первым параметром и столбец EmpName со вторым параметром.если вы новичок в команде OLE DB, проверьте следующий пример для получения более подробной информации.


Ссылки

...