SSIS - 不允许如果

时间:2016-10-10 17:44:20

标签: sql-server ssis etl

我有一个包含Active和Terminated员工的员工表,其中一个栏目是工作电子邮件。已终止的员工应列出其个人电子邮件,并且活跃员工应列出其工作电子邮件。但是,我从中提取信息的源系统允许活跃的员工更新他们的工作电子邮件。所以我有一些活跃的员工列出了他们的个人电子邮件。

出于我的目的,我需要所有活跃的员工列出他们的工作电子邮件。在SSIS中,解决我的问题的最佳方法是什么?

Ex: 
Name      Status    Email
Bob       Act       bob@workdomain.com
Joey      Ter       joey234@yahoo.com
Randy     Act       randy23@hotmail.com

在这里,由于Randy是Active员工应该有一封以@ workdomain.com结尾的电子邮件,但是在源系统中我从Randy提取数据后将他的电子邮件更改为他的个人邮件。兰迪的电子邮件应该是:randy@workdomain.com

2 个答案:

答案 0 :(得分:0)

我会像下面这样做(为了避免OLEDB转换 - 逐行操作)。

将数据加载到2个临时表(可能是临时表):

表#1中。 StageEmp:

Name      Status    Email
Bob       Act       bob@workdomain.com
Joey      Ter       joey234@yahoo.com
Randy     Act       randy23@hotmail.com

表#2:CorrectEmail

Name      Email
Randy     randy23@hotmail.com

执行SQL任务

Update s
SET s.email = c.email
FROM StageEmp s
Join CorrectEmail c
ON s.Name = c.Name
where s.status = 'Act'
AND s.email not like '%@workdomain.com'

您应该使用key列代替Name

将StageEmp的数据加载到实际表中或直接更新到实际表。

答案 1 :(得分:0)

据我所知,您有一个数据流任务,您可以在其中使用一个Excel Source从excel文件中获取数据。你可以这样做 -

var content = [{ id: 'tab1', langCode: 'en', title: 'rocket' }, { id: 'tab1', langCode: 'da', title: 'raket' }, { id: 'tab2', langCode: 'es', title: 'boligrafo' }, { id: 'tab2', langCode: 'en', title: 'pen' }],
    object = Object.create(null);

content.forEach(function (a) {
    object[a.id] = object[a.id] || {}
    object[a.id][a.langCode] = a;
});		

var result = Object.keys(object).map(k => object[k][Object.keys(object[k]).filter(l => l !== 'en')[0] || 'en']);

console.log(result);

希望我能够解释。 enter image description here