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