如何使用 SSIS 包将带有标题和详细数据的平面文件加载到数据库中?
我必须加载一个具有不同标题和详细信息以及可变列数的平面文件。这些有亲子关系。如何将数据加载到SQL Server中?该文件如下所示:
DEP*0116960*20110511***01*061000104*DA*1000022220940
AMT*3*13006.05
QTY*41*3
QTY*42*5
BAT*20110511**STAWRRY11051101
AMT*2*9332.33
QTY*42*2
BPR*I*4799*C*CHK*PBC*01*011500010*DA*394001464351
REF*CK*0000001002
BPR*I*4533.33*C*CHK*PBC*01*011500010*DA*394001464351
REF*CK*0000001001
BAT*20110511**STAWRRY11051102
AMT*2*1986.99
QTY*42*2
BPR*I*853.97*C*CHK*PBC*01*111000614*DA*708340062
REF*CK*0010736416
RMR*ST*00090183**853.97*12199.61
REF*BE*01*0123181825*0
REF*SL*NA*191219012318
DTM*810*20110430
BPR*I*1133.02*C*CHK*PBC*01*111000614*DA*708340062
REF*CK*0010736417
RMR*ST*00090184**1133.02*16186.04
REF*BE*01*0123181825*0
REF*SL*NA*191219012318
DTM*810*20110430
BAT*20110511**STAWRRY11051103
AMT*2*1686.73
QTY*42*1
BPR*I*1686.73*C*CHK*PBC*01*075911742*DA*0100461755
REF*CK*0000002795
RMR*ST*00094075**1686.73*42168.16
REF*BE*01*0123181825*0
REF*SL*NA*191219012318
DTM*810*20110331
SE*39*000000088
GE*1*88
IEA*1*000000088
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
以下是将此文件加载到 SQL Server 中的一种可能方法。下面显示的示例读取 EDI 823 Lockbox 文件的内容并连同关系一起加载到多个表中。我确信还有其他更好的方法可以做到这一点。这只是将 EDI 文件加载到 SQL Server 中的一个示例。
该示例逐行读取 EDI 文件,然后根据字符星号 (*) 拆分它们。脚本组件将值分配给脚本组件中的变量以填充表。在
数据流任务
填充数据后,执行SQL任务
将更新表dbo.AMT中的ParentId列
、dbo.DTM
、dbo.QTY
和dbo.REF
使用存储过程dbo.UpdateHierarchy
>。表“ISA”包含所有其他段的数据。屏幕截图显示了数据如何存储在子表中。所有表中使用的
SetId
列将对文件的数据进行分组,以避免从另一个文件中提取的数据引用错误的父 ID。SetId
对于加载到这些表中的每个文件来说都是唯一的。分步过程:
创建 5 个名为
dbo.AMT
、dbo.DTM
的表,数据库中的dbo.ISA
、dbo.QTY
和dbo.REF
以及名为dbo.UpdateHierarchy
的存储过程使用 SQL 下提供的脚本脚本部分。表AMT
、DTM
、QTY
和REF
将存储命名相似的段的数据以及表ISA
将包含所有其他段数据。创建一个名为 SQLServer 的
OLE DB 连接
以连接到 SQL Server 实例,并创建一个名为Source< 的
平面文件连接
/code> 如屏幕截图所示#""1"" - #4。平面文件连接将使用 EDI 文件。删除列分隔符
,因为文件的元素数量不同。此示例将使用脚本组件
分割元素。在 SSIS 包上,创建 5 变量,如屏幕截图 #5 所示。另外,将一个
数据流任务
和一个执行SQL任务
放在包的控制流
选项卡上,如屏幕截图#5所示。使用
平面文件源
、脚本组件
、多播
、条件拆分
和<配置数据流任务strong>5OLE DB 目标
,如屏幕截图 #6 所示。配置
平面文件源
以使用平面文件连接名称Source
读取EDI文件。将
脚本组件
配置为转换任务,如屏幕截图#7和#8所示。使用脚本组件变量部分下提供的数据使用名称和数据类型创建所有其他变量。将脚本组件转换
任务中的ScriptMain类替换为脚本组件代码下提供的代码。配置
条件拆分
,如屏幕截图 #9 所示。配置
OLE DB 目标
AMT 以将数据插入表dbo.AMT
并映射字段,如屏幕截图所示 # 10.配置
OLE DB 目标
QTY 以将数据插入表dbo.QTY
并映射字段,如屏幕截图所示 # 11.配置
OLE DB 目标
REF 将数据插入表dbo.REF
并映射字段,如屏幕截图所示 # 12.配置
OLE DB 目标
DTM 将数据插入表dbo.DTM
并映射字段,如屏幕截图所示 # 13.配置
OLE DB 目标
其他,将数据插入表dbo.ISA
并映射字段,如屏幕截图所示 # 14.在“数据流”选项卡上,配置
执行 SQL 任务
,如屏幕截图 #15 所示。屏幕截图 #16 和 #17 显示示例包执行情况。用于测试此示例的文件数据在
EDI 文件内容
部分下提供。屏幕截图 #18 显示表
dbo.AMT
中的数据与表dbo.ISA
中的数据的比较。屏幕截图 #19 显示表
dbo.QTY
中的数据与表dbo.ISA
中的数据进行比较。屏幕截图 #20 显示表
dbo.REF
中的数据与表dbo.ISA
中的数据的比较。屏幕截图 #21 显示表
dbo.DTM
中的数据与表dbo.ISA
中的数据的比较。希望有帮助。
SQL 脚本:
脚本组件变量:
脚本组件代码:
VB.NET 可在 中使用的代码>
SSIS 2005 及更高版本
。EDI 文件内容:
屏幕截图 #1:
屏幕截图 #< strong>2:
屏幕截图 #3:
屏幕截图 #4:
屏幕截图 #5:
屏幕截图 # 6:
屏幕截图 #7:
屏幕截图 #8:
屏幕截图 # 9:
屏幕截图 #10:
屏幕截图 #11:
屏幕截图#12:
屏幕截图 #13:
屏幕截图 #14:
屏幕截图 #15:
屏幕截图 #16 strong>:
屏幕截图 #17:
屏幕截图 #18:
屏幕截图 #19:
屏幕截图#20:
屏幕截图 #21:
Here is one possible way of loading this file into SQL Server. Below shown example reads the contents of EDI 823 Lockbox file and loads into multiple tables along with the relationship. I am sure that there are other better ways of doing this. This is just one example of loading an EDI file into SQL Server.
The example reads the EDI file line by line and then splits them based on the character asterisk (*). The script component assigns the value to the variables in the Script Component to populate the tables. After the data is populated by the
Data Flow Task
, theExecute SQL Task
will update the ParentId column in the tablesdbo.AMT
,dbo.DTM
,dbo.QTY
anddbo.REF
using the stored proceduredbo.UpdateHierarchy
. The table 'ISA' contains the data of all other segments. Screenshots show how the data is stored in the child tables.SetId
columns used in all the tables will group data of a file in order to avoid wrong parent id being referred from data pulled from another file.SetId
will be unique for each file loaded into these tables.Step-by-step process:
Create 5 tables named
dbo.AMT
,dbo.DTM
,dbo.ISA
,dbo.QTY
anddbo.REF
and a stored procedure nameddbo.UpdateHierarchy
in the database using the scripts provided under SQL Scripts section. TablesAMT
,DTM
,QTY
andREF
will store the data of the segments named similarly and the tableISA
will contain all other segment data.Create an
OLE DB Connection
named SQLServer to connect to the SQL Server instance and create aFlat File Connection
namedSource
as shown in screenshots #""1"" - #4. Flat File connection will use the EDI file. Remove theColumn delimiter
because the file has varying number of elements. This example will split the elements using theScript Component
.On the SSIS package, create 5 variables as shown in screenshot #5. Also, place a
Data Flow task
and anExecute SQL Task
on theControl Flow
tab of the package as shown in screenshot #5.Configure the Data Flow Task with
Flat File Source
,Script Component
,Multicast
,Conditional Split
and 5OLE DB Destinations
as shown in screenshot #6.Configure the
Flat File Source
to read the EDI file using the Flat File connection nameSource
.Configure the
Script Component
as Transformation task as shown in screenshots #7 and #8. Create all the other variables using the names and data types using the data provided under Script Component Variables section. Replace the class ScriptMain present within theScript Component Transformation
task with the code provided under Script Component Code.Configure the
Conditional Split
as shown in screenshot #9.Configure the
OLE DB Destination
AMT to insert data into the tabledbo.AMT
and map fields as shown in screenshot #10.Configure the
OLE DB Destination
QTY to insert data into the tabledbo.QTY
and map fields as shown in screenshot #11.Configure the
OLE DB Destination
REF to insert data into the tabledbo.REF
and map fields as shown in screenshot #12.Configure the
OLE DB Destination
DTM to insert data into the tabledbo.DTM
and map fields as shown in screenshot #13.Configure the
OLE DB Destination
Other to insert data into the tabledbo.ISA
and map fields as shown in screenshot #14.On the Data Flow tab, configure the
Execute SQL Task
as shown in screenshot #15.Screenshots #16 and #17 shows sample package execution. File data used for testing this example is provided under section
EDI File Content
.Screenshot #18 shows data in table
dbo.AMT
in comparison with data in tabledbo.ISA
.Screenshot #19 shows data in table
dbo.QTY
in comparison with data in tabledbo.ISA
.Screenshot #20 shows data in table
dbo.REF
in comparison with data in tabledbo.ISA
.Screenshot #21 shows data in table
dbo.DTM
in comparison with data in tabledbo.ISA
.Hope that helps.
SQL Scripts:
Script Component Variables:
Script Component Code:
VB.NET code that can be used in
SSIS 2005 and above
.EDI File Content:
Screenshot #1:
Screenshot #2:
Screenshot #3:
Screenshot #4:
Screenshot #5:
Screenshot #6:
Screenshot #7:
Screenshot #8:
Screenshot #9:
Screenshot #10:
Screenshot #11:
Screenshot #12:
Screenshot #13:
Screenshot #14:
Screenshot #15:
Screenshot #16:
Screenshot #17:
Screenshot #18:
Screenshot #19:
Screenshot #20:
Screenshot #21:
您可以使用脚本组件源来构建处理文件的规则。 此处和此处。您也许可以使用 来自 CozyRoc 的 EDI 源,但我不相信他们表明它已通过 EDI 823 测试。
You can use a script component source to build the rules on handling the file. That's well described here and here. You may be able to use the EDI Source from CozyRoc, but I don't believe they have indicated it has been tested with EDI 823.
这就是翻译引擎可用并如此广泛使用的原因。我喜欢上面解决方案的细节,但也觉得有一些轮子的重新发明。
看看吉特比特。它是开源的,并且对于数据转换非常用户友好。
您可以对源进行建模,对目标进行建模,然后进行转换。根据您的模型,您将能够更好地控制 SSIS 为您提供的转换。当然有一个学习曲线,但您可以自动化通信/转换。也将需要编写零代码。
This is why translation engines are available and so widely used. I love the detail of the solution above, but also feel like there's some reinvention of the wheel.
Take a look at Jitterbit. It is open source, and pretty user friendly for data transformations.
You can model your source, model your target and then do a transformation. Based on your models, you'll have much more control over the transformation that what SSIS will give you. Sure there's a learning curve, but you can automate the communication / transformation. There also would be ZERO code to write.