从不同服务器上的表更新数据
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 加入列的日期。
我需要根据 MAX 条件获取最新的加入日期,并且需要使用 SSIS 的 LIKE 条件。
最初我使用了 EXECUTE SQL TASK 并通过变量发送完整的结果集并将该 SQL TASK 放入 For Each 循环容器
并且需要在 Employee table 中更新,如下所示:
EmpID EmpName DOJ
1 Mohan 2018-08-01
2 Manasa 2017-09-01
我用过
- EXECUTE SQL TASK :我在其中编写了查询
SELECT EMPNAME FROM EMPLOYEE
并给出了完整的结果集并存储在变量 中
- FOR EACH LOOP CONTAINER : 使用 ADO.ENUMERATOR 并使用那个变量 .
请提出实现此目的的方法
员工 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
我有 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 加入列的日期。 我需要根据 MAX 条件获取最新的加入日期,并且需要使用 SSIS 的 LIKE 条件。
最初我使用了 EXECUTE SQL TASK 并通过变量发送完整的结果集并将该 SQL TASK 放入 For Each 循环容器
并且需要在 Employee table 中更新,如下所示:
EmpID EmpName DOJ
1 Mohan 2018-08-01
2 Manasa 2017-09-01
我用过
- EXECUTE SQL TASK :我在其中编写了查询
SELECT EMPNAME FROM EMPLOYEE
并给出了完整的结果集并存储在变量 中
- FOR EACH LOOP CONTAINER : 使用 ADO.ENUMERATOR 并使用那个变量 .
请提出实现此目的的方法
员工 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