源表中有4列。
来源表:第1栏,第2栏,第3栏,第4栏
在源表的这4列中,我想在目标表中只插入2列。
目标表:包含A列和B列
在A列和B列中插入值。现在我想在SSIS包中执行订单操作。
所以我想在SSIS中使用oder逻辑。
如果第1列中有值,则在目标列A中使用该值,并从第1列值插入A列。因此,如果第1列中有值,则将插入目标表中的列A.
如果第1列中没有值,则检查源表中的第2列,如果第2列中有值,则在A列中插入该值。
现在假设,第1列为空,第2列为值,第2列值将插入目标表的A列。
现在检查源列中的第3列并查看是否有值,如果有值,则将该值插入Destination表中的B列。如果第3列中没有值,则从源中检查第4列。
所以基本上检查顺序中的那4列(指定的)和我们遇到的第一个值,在目标列A和列B中使用它。
那里有棘手的部分,所以第一个不是空值进入目的地列A和第二个非空值进入第二个目标列B,我怎么能弄明白哪一个是第二个非空值?
我想我们可以在SQL中执行此操作,但我想在SSIS包中执行此操作。
我将非常感谢你的帮助。先感谢您。
答案 0 :(得分:0)
虽然你可以通过衍生列来完成这项工作,但它会变得混乱。这样的东西可以在脚本组件中更好地表达。
将脚本组件作为转换添加到数据流中。在Input Rows选项卡中,选择cols 1-4作为ReadOnly。在“输出”选项卡中,将2个新列添加到“输出”缓冲区中作为列A和列B,并确保将数据类型设置为与列1-4匹配。返回“常规”选项卡,单击“脚本”。
在ProcessInputRow
方法中,您需要计算将分配给A和B的内容。以下代码为近似值。如果你需要它原始,评论,我会在我在PC上修复它。
int firstNonNull = 0;
string colA = string.Empty;
string colB = string.Empty;
// Assign a value for colA and remember
// where we found it
if (!Row.Col1_IsNull)
{
firstNonNull = 1;
colA = Row.Col1;
}
else if (!Row.Col2_IsNull)
{
firstNonNull = 2;
colA = Row.Col2;
}
// Question does not address whether we will find
// non null values in 2 columns exactly
// assuming not
else if (!Row.Col3_IsNull)
{
firstNonNull = 3;
colA = Row.Col3;
}
else if (!Row.Col4_IsNull)
{
firstNonNull = 4;
colA = Row.Col4;
}
// Now to assign a value for B
// Assume that the next column after the first non null is populated
// otherwise, repeat above process
switch (firstnonNull)
{
case 1:
colB = Row.Col2;
break;
case 2:
colB = Row.Col3;
break;
case 3:
colB = Row.Col4;
break;
// Now what?
}
一个更聪明的人可能会将所有值弹出到List或其他内容中,然后找到前两个非空置或其他方法,但这对于维护非常简单。