在我的平面文件源中,我想在OLDEDB中传输所有这些数据。
但我想将数据分成不同的表格。
实施例。
表1从第一个%F开始,在col [0]中的另一个%F之前结束
并且表2在第二个%F中以不同的头开始,因为它具有与第一个表不同的字段。
这在SSIS中是否可行?
答案 0 :(得分:0)
看起来,在单个平面文件中,提供了2个表数据。从图像看起来,两个表也有不同的数据结构。我认为,很难一步加载文件。
可能是,这个步骤会帮助你。
步骤1.将所有数据加载到表中(转到名为[Table]
的表)。加载包括column headers
。数据可能看起来像这样(只是一个模式作为示例。)
在此表中,请确保添加增量列
步骤2.如下所示的查询将帮助您确定第二个表从哪一行开始。
Select Top 1 Column0 From [Table] Where Column1 = '%F' Order By Column0 Desc
在你的ssis包中,添加一个变量来存储上面的结果
步骤3.添加源为[Table].
的dft在源添加条件分割后。
If Column0 < variable value, sent row to [Table1]
else to [Table2]
可能还有一些修改。
根据评论添加:
如果您有超过1张桌子。
第1步。将所有数据加载到一个表中。
第2步。添加一个附加列(图像中的[columnX])。它的价值应该是这样的,你应该能够识别表格。
第3步。使用条件拆分本身,使用columnX将每一行映射到其对应的表。
根据要求,添加了编辑: 使用这样的逻辑。在SSMS中运行脚本并查看结果。
Declare @table table (id int identity(1,1),Col1 varchar(5), ColX int)
Insert into @table (Col1) Values
('%F'),('%R'),('%R'),('%R'),('%R'),('%R'),('%R'),
('%F'),('%R'),('%R'),('%R'),('%R'),('%R'),('%R'),
('%F'),('%R'),('%R'),('%R'),('%R')
Select *
from @table A
Update Y
Set ColX = Z.X
From @table Y Join(
Select A.id FromId,B.id ToId,A.X From
(
Select id,ROW_NUMBER() Over (Order By id) X From (
Select id from @table Where Col1 = '%F'
Union
Select max(id) id From @table ) Lu ) A,
(
Select id,ROW_NUMBER() Over (Order By id) X From (
Select id from @table Where Col1 = '%F'
Union
Select max(id) id From @table ) Lu ) B
Where A.X = B.X - 1 ) Z On Y.id >= Z.FromId and Y.id < Z.ToId
Select *
from @table A
Select *
from @table A