我有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
我用过
SELECT EMPNAME FROM EMPLOYEE
,并给出了完整的结果集并存储在变量中请提出实现此目标的方法
Employee表来自SQL Server,Department表来自Teradata
答案 0 :(得分:1)
我认为您可以使用不带Foreach循环容器的Execute SQL Task来实现此目标:
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;
如果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;
或者,如果您希望使用不太精确的条件开始加入:
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 + '%';
我认为最简单的方法是在SSMS中或通过T-SQL对Teradata数据库进行create a linked server并执行上述查询。
另一种方法是将部门表导入到SQL Server中的临时表,然后执行上面的查询之一。
如果您没有创建链接服务器或将数据导入临时表的权限,则可以使用类似的命令从部门表中获取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命令,请检查以下示例以了解更多详细信息。