更新来自不同服务器上表的数据

时间:2019-02-05 18:55:56

标签: sql sql-server ssis teradata etl

我有2个表Employee和Department表

员工: (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

我需要在何处使用“部门”表更新“雇员”表的“加入日期”列。  我需要根据MAX条件获取最新的加入日期,并需要通过SSIS使用LIKE条件。

最初,我使用EXECUTE SQL TASK并通过变量发送FULL RESULT SET,并将该SQL TASK放入For Each循环容器中

并且需要在Employee表中进行如下更新:

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

我用过

  • 执行SQL任务:我编写了查询SELECT EMPNAME FROM EMPLOYEE,并给出了完整的结果集并存储在变量中
  • 对于每个循环容器:使用ADO.ENUMERATOR并使用该变量。

请提出实现此目标的方法

Employee表来自SQL Server,Department表来自Teradata

1 个答案:

答案 0 :(得分:1)

(1)如果源和目标在同一服务器上

我认为您可以使用不带Foreach循环容器的Execute SQL Task来实现此目标:

(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数据库进行create a linked server并执行上述查询。

(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命令,请检查以下示例以了解更多详细信息。


参考