在一个领域SSIS拆分整数倍值代入行

问题描述:

请帮我分列的字段值成多行。在一个领域SSIS拆分整数倍值代入行

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

我用VB做了类似的事情。不知道这是否有帮助,但我还包括下面的VB代码作为两个额外的潜艇。这对我有用。我认为在C中一定有类似的东西? ()作为整型,ByVal缓冲区()作为Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer) MyBase.PrimeOutput(Outputs,OutputIDs,Buffers) End Sub Public Overrides子CreateNewOutputRows() 结束Sub' – MiguelH

+0

使用SQL查询对于采用拆分()函数来输出所需的行源组件。 –

99%的路上。

给定一个源像

SELECT 
    1 AS ID   
, 'Jack' AS Name 
, 'Florida' AS Location 
, '101,102,103' AS DeptNo; 

,因为它不会是一个1脚本任务变得异步:输入到输出缓冲器。我对你的脚本做了3处修改。

第一次是在创建edpt阵列。可能有一种方法来拆分字符串并将结果直接转换为可为空的整数数组,但它并没有想到。

string[] Edpt = Row.DeptNo.Split(new char[] { ',' }); 

第二个变化是你的循环。 while (i < DeptNo.Length)将查看源DeptNo字符串中的每个字符。所以你必须像在11个输出缓冲器(然后就当它试图把逗号为整数(除非它把它作为一个char数据类型,然后使用ASCII值失败)。无论如何,以赫克与while循环,除非你需要他们。在foreach有助于消除一个错误,可怕的了。所以,我通过我的收藏(Edpt)和我觉得每个值枚举,我把它分配给一个循环范围变量称为item

foreach (var item in Edpt) 

最后的变化是在我的输出缓冲器中的分配。Output0Buffer.DeptNo = DeptNo[i];再次将仅在原始字符串来访问一个特定的值(1,0,1,,, 1,0,2,,,等等)。相反,你想对Output0Buffer.DeptNo = Edpt[i];这样的分割数组进行操作但是,因为我们不需要做任何有序访问,我们只需参考item

 Output0Buffer.DeptNo = Int32.Parse(item); 

最终代码看起来像

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    // Create an array of the department numbers as strings 
    string[] Edpt = Row.DeptNo.Split(new char[] { ',' }); 

    // no longer needed 
    int i = 0; 

    // foreach avoids off by one errors 
    foreach (var item in Edpt) 
    { 

     Output0Buffer.AddRow(); 

     Output0Buffer.ID = Row.ID; 
     Output0Buffer.Name = Row.Name; 
     Output0Buffer.Location = Row.Location; 

     // use the iterator directly 
     Output0Buffer.DeptNo = Int32.Parse(item); 
    } 

} 

enter image description here