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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自不同服务器上的表更新数据相关的知识,希望对你有一定的参考价值。

我有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

当我需要更新使用部门表连接列的Employee表日期。我需要参加基础上的MAX条件的最新日期和需要在使用SSIS LIKE条件使用。

起初,我已经使用执行SQL任务和发送的通过可变整个结果集,并把该SQL任务分成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和部门表的Teradata

答案

(1) If Source and Destination are on the same server

我认为你可以使用不带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

如果部门表中包含一个全名及员工表中包含你应该使用下面的查询只名字:

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) If Source and Destination are on different servers

(一)创建SQL Server Management Studio中链接服务器

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

(b)利用一个临时表

另一种方法,是导入部门表,在SQL Server中的临时表,然后执行上面的查询之一。

(三)使用查找与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命令(SQL Server连接)按行,执行更新操作行使用类似的命令:

Update Employee SET DOJ = ? WHERE EmpName = ?

和在列映射选项卡的DOJ列映射到所述第一参数和EmpName柱到第二参数。如果你是新的OLE DB命令查询详细情况下面的例子。


References

以上是关于来自不同服务器上的表更新数据的主要内容,如果未能解决你的问题,请参考以下文章

通过常用功能更新不同的阵列

连接来自不同数据库的表的性能影响

PostgreSQL比较不同服务器上的数据[重复]

读取位于 LINUX 服务器上的文本文件并更新 SQL Server 数据库中的表

如何比较来自不同数据库的两个表

使用来自不同数据库的新表数据更新旧表数据