2013-10-29 216 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