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

Update data from tables on different servers

我有 2 table 员工和部门 table

员工: (SQL 服务器)

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

我需要在哪里更新员工 table 使用部门 table 加入列的日期。 我需要根据 MA​​X 条件获取最新的加入日期,并且需要使用 SSIS 的 LIKE 条件。

最初我使用了 EXECUTE SQL TASK 并通过变量发送完整的结果集并将该 SQL TASK 放入 For Each 循环容器

并且需要在 Employee table 中更新,如下所示:

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

我用过

请提出实现此目的的方法

员工 table 来自 SQL 服务器和部门 table 是 Teradata

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

我认为您可以在没有 Foreach 循环容器的情况下使用执行 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

如果部门 table 包含全名而员工 table 仅包含名字,您应该使用以下查询:

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) 如果 Source 和 Destination 在不同的服务器上

(a) 在 SQL SERVER Management Studio

中创建链接服务器

我认为最简单的方法是在 SSMS 中 create a linked server 或在 Teradata 数据库中使用 T-SQL 并执行上面的查询。

(b) 使用分段 table

另一种方法是将部门 table 导入 SQL 服务器中的临时 table,然后执行上述查询之一。

(c) 通过 OLEDB 命令使用查找

如果您没有创建链接服务器或将数据导入临时 table 的权限,您可以使用类似的命令从部门 table 获取 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 命令 (SQL 服务器连接) 逐行执行更新操作,使用类似的命令:

Update Employee SET DOJ = ? WHERE EmpName = ?

并在“列映射”选项卡中将 DOJ 列映射到第一个参数,将 EmpName 列映射到第二个参数。如果您不熟悉 OLE DB 命令,请查看以下示例以了解更多详细信息。


参考资料

  • sql - how to split fullname into first and last name
  • "Like" operator in inner join in SQL