2015-10-15 72 views
-1

請幫我分列的字段值成多行。在一個領域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查詢對於採用拆分()函數來輸出所需的行源組件。 –

回答

2

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