2013-10-29 217 views
4

我在SQL Server中有一個3列的表,其中一列是包含由逗號分隔的連續列的行的數據列。第一行也是我想要創建的新表的標題行。所以基本上我想打開它。使用逗號分隔符將單列數據拆分爲SSIS中的多列

Data  | ID | Source 
==================== 
a,b,c,d,e | 1 | a.csv 

f,g,h,i,j | 2 | b.csv 

a | b | c | d | e 
================= 
f | g | h | i | j 

使用SSIS,我能想到做它使用的是轉儲到數據列的文本文件,然後唯一的辦法重新閱讀它作爲一個平面文件源,但我寧願避免創建額外的不必要的文件

編輯:使用對不起林2008 SSIS

回答

4

你可以做的是按原樣讀取文件。 並在腳本任務中分割這些值。

所以從源代碼轉到腳本任務。 然後在腳本任務中作爲輸入列,選擇包含這些值的列(InputColumn1)。然後指定輸出列(如果我是對的,我看你有5,所以指定5(OutputColumn1 - 5))。

完成後,轉到腳本本身(C#)。

下:

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
} 

將下面的代碼在那裏:

var ColumnValue = Row.InputColumn1.Split(','); 

Row.OutputColumn1 = ColumnValue[0]; 
Row.OutputColumn2 = ColumnValue[1]; 
Row.OutputColumn3 = ColumnValue[2]; 
Row.OutputColumn4 = ColumnValue[3]; 
Row.OutputColumn5 = ColumnValue[4]; 

腳本任務後所有列從源還有OutputCoulmns1-5將可用,您可以做你必須做的。

輸出

Data  | ID | Source |OutputColumn1 |OutputColumn2| etc. 3-5 
================================================================ 
a,b,c,d,e | 1 | a.csv | a   | b 

f,g,h,i,j | 2 | b.csv | f   | g 

請問,如果事情是不明確。

+0

我遵循你的指示,但它似乎已將InputColumn1作爲Blob使用,因此不允許Split方法。我嘗試過使用ToString().Split(',')(得到一個索引超出了數組錯誤的界限),但那也沒有效果。我進入BufferWrapper.cs文件,看到InputColumn1的類型是Blob,並且正在返回一個BlobColumn,嘗試用字符串替換該類型,但是然後得到一個無法轉換類型爲'Microsoft.SqlServer.Dts.Pipeline.BlobColumn'的對象。鍵入'System.String'錯誤。是否可以這樣做? – VishalJ

+0

說實話,我從來沒有與Blob合作過。你不能在源任務中改變它嗎?改變它收到的類型? –

+0

不要編輯BufferWrapper.cs,它會自動生成。您只能在腳本組件編輯器中修改輸入的數據類型。你實際需要的是一個「數據轉換」組件來處理你的blob。將它放在腳本組件之前並將該列轉換爲字符串 – TsSkTo

3

可以使用Token表達隔離的良好分隔的字符串,分隔符。

使用derived column transformation和是這樣的:

TOKEN([Name_of_your_Column], 「」,1)

應該給你 「一」

TOKEN( [Name_of_our_Column],「,」,2)

應該給你「b」

你也可以設置一個簡單的轉換script component。使用您的「數據」列作爲輸入並根據需要添加儘可能多的輸出。使用split方法並設置好。

string [] myNewColumns = inputColumn.split(「,」);

+0

我猜這是2012年的一個表達式,我實際上使用2008年,對於混淆感到抱歉 – VishalJ

+0

它不會影響..我不知道SQL 2008沒有這些表達式。 – TsSkTo

+0

TOKEN在SQL Server 2012中非常有用。請注意,有一個有趣的[令牌計數問題](http://stackoverflow.com/questions/12917758/why-does-ssis-token-function-fail-to-count-相鄰列分隔符)時,您的分隔字符串包含一些空字段。 – criticalfix