如何在SSIS包中执行订单逻辑,以便通过列为非空的oder将值从源插入到目标

时间:2013-09-13 22:34:31

标签: ssis

源表中有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包中执行此操作。

我将非常感谢你的帮助。先感谢您。

1 个答案:

答案 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或其他内容中,然后找到前两个非空置或其他方法,但这对于维护非常简单。