请帮我将列的字段值拆分为多行。
表
ID Name Location DeptNo
1 Jack Florida 101,102,103
我正在寻找像这样的输出
ID Name Location DeptNo
1 Jack FLorida 101
1 Jack FLorida 102
1 Jack FLorida 103
我已经使用脚本组件找出ssis中的配置但不确定我的代码
请检查
public class ScriptMain : UserComponent
{
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
int[] Edpt = Row.DeptNo.ToInt().Split(new int[] { ',' }, IntSplitOptions.None);
int i = 0;
while (i < DeptNo.Length)
{
Output0Buffer.AddRow();
Output0Buffer.ID = Row.ID;
Output0Buffer.Name = Row.Name;
Output0Buffer.Location = Row.Location;
Output0Buffer.DeptNo = DeptNo[i];
i++;
}
}
}
答案 0 :(得分:2)
99%的路上。
给出像
这样的来源SELECT
1 AS ID
, 'Jack' AS Name
, 'Florida' AS Location
, '101,102,103' AS DeptNo;
您的脚本任务变为异步,因为它不会是输出缓冲区的1:1输入。我对你的剧本进行了3次修改。
第一个是创建edpt数组。可能有一种方法可以分割字符串并将结果直接转换为可以为空的整数数组但是没有想到它。
string[] Edpt = Row.DeptNo.Split(new char[] { ',' });
第二个变化是你的for循环。 while (i < DeptNo.Length)
将查看源DeptNo字符串中的每个字符。所以你会创建11个输出缓冲区(当它尝试将逗号放入一个整数时会失败(除非它将它视为char数据类型然后使用ascii值)。无论如何,要哎呀with while循环,除非你需要它们。foreach
有助于消除一个错误导致的恐惧。所以,我通过我的集合(Edpt)枚举,并且对于我找到的每个值,我将它分配给一个名为{的循环范围变量{1}}
item
最后的更改是输出缓冲区中的赋值。 foreach (var item in Edpt)
再次只能访问原始字符串中的特定值(1,0,1 ,, ,, 1,0,2,等等)。相反,您希望对Output0Buffer.DeptNo = DeptNo[i];
之类的分割数组进行操作但是,由于我们不需要执行任何序数访问,因此我们只需引用Output0Buffer.DeptNo = Edpt[i];
。
item
最终代码看起来像
Output0Buffer.DeptNo = Int32.Parse(item);