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