我必须使用 ssis 将 EDI 823 密码箱文件加载到 SQl 服务器数据库中。谁能告诉我如何处理不同行之间的父子关系。
问问题
1468 次
1 回答
3
更新:以下答案仅显示了将简单的父子数据加载到 SQL Server的示例。
检查此链接以了解如何EDI 823 lockbox
使用 SSIS 加载实际文件。
这是一个可能的选项,您可以使用它来加载父子/标题详细信息。
在这种情况下,我有一个包含与国家和州有关的标题详细信息的平面文件。以开头的行HDR
表示标题行,以开头的行DTL
表示详细信息。有关示例文件内容,请参阅屏幕截图 # 1。
分步过程:
- 在一个数据库(我选择 SQL Server)中,创建两个名为
dbo.Header
和的表dbo.Detail
。有关这些表的创建脚本,请参阅部分Tables
。我们将在此示例 SSIS 包的帮助下通过读取平面文件内容来填充这些表。 - 在 SSIS 包上,拖放两个数据流任务。将它们命名为
Header
和Detail
。请参阅屏幕截图 # 2以了解它们应该如何放置。 - 创建一个名为 的数据类型字符串变量
HeaderCode
。将值分配HDR
给变量。参考截图# 3。 - 配置 Header 数据流任务,如屏幕截图 # 4所示。下面的步骤 5 - 11 描述了 Header 数据流任务中的每个转换任务。
Read File
是一个平面文件源,它被配置为读取屏幕截图 #1 中显示的文件。此任务中使用的平面文件连接的配置设置如屏幕截图 # 5 - # 9所示Data clean up
是派生列转换任务,用于删除输入中存在的任何空格。参考截图# 10。Segregate data
是一个脚本组件转换任务。拖放脚本组件时,选择转换选项。请参阅屏幕截图 # 11以了解如何配置Input Columns
此任务。请参阅屏幕截图 # 12以了解如何配置Input and Outputs
此任务。输出列IsHeader
是数据类型DT_BOOL,输出列 HeaderKey 是数据类型DT_STR,长度为50。选择Script
左侧并单击Edit Script...
。将脚本组件中的代码替换为在脚本任务组件中使用的代码部分中给出的代码。Multicast
顾名思义是一个多播转换任务。它没有任何特殊配置。Fetch Detail
是一个有条件的分裂变换任务。请参阅屏幕截图 # 13来配置此任务。Header
是配置为连接到新创建的表 dbo.Header 的 OLE DB 目标。此任务的字段映射显示在屏幕截图 # 14中。Staging
是配置为写入 CSV 文件的平面文件目标。此连接管理器的配置显示在屏幕截图 # 15 - # 16中。暂存连接管理器中有四列。Code
并且Value
列的数据类型为DT_STR,长度为255;IsHeader
是数据类型DT_BOOL;HeaderKey
是长度为50的数据类型字符串。任务的字段映射Staging
显示在屏幕截图 # 17中。- 然后我们继续下一个数据流任务
Detail
。 - 配置详细数据流任务,如屏幕截图# 18所示。下面的步骤 14 - 16 描述了详细数据流任务中的每个转换任务。
Staging
是一个平面文件源,配置为使用Staging
在步骤# 11中创建的连接管理器。Get Header Id
是配置为指向表 dbo.Header 的查找转换。此任务的列配置显示在屏幕截图 # 19中。Detail
是配置为连接到新创建的表 dbo.Detail 的 OLE DB 目标。此任务的字段映射显示在屏幕截图 # 20中。- 屏幕截图 # 21和 # 22显示了数据流任务 Header 和 Detail 的执行情况。
- 屏幕截图 # 23显示加载到表中的数据。
希望有帮助。
脚本任务组件中使用的代码 (在上面的步骤 #7 中提到):
只能在SSIS 2008 and above
. .
/*Microsoft SQL Server Integration Services Script Component
* Write scripts using Microsoft Visual C# 2008.
* ScriptMain is the entry point class of the script.*/
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
string currentValue = string.Empty;
string previousHeader = string.Empty;
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
IDTSVariables100 varCollection = null;
this.VariableDispenser.LockForRead("User::HeaderCode");
this.VariableDispenser.GetVariables(out varCollection);
currentValue = Row.ValueTrimmed.ToString();
if (Row.CodeTrimmed.ToString() == varCollection["User::HeaderCode"].Value.ToString())
{
Row.IsHeader = true;
if (previousHeader != currentValue)
{
previousHeader = currentValue;
}
}
Row.HeaderKey = previousHeader;
varCollection.Unlock();
}
}
表: 。
CREATE TABLE [dbo].[Detail](
[DetailId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](255) NOT NULL,
[HeaderId] [int] NOT NULL,
CONSTRAINT [PK_Detail] PRIMARY KEY CLUSTERED
(
[DetailId] ASC
)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Header](
[HeaderId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](255) NOT NULL,
CONSTRAINT [PK_Header] PRIMARY KEY CLUSTERED
(
[HeaderId] ASC
)) ON [PRIMARY]
GO
截图#1:
截图#2:
截图#3:
截图#4:
截图#5:
截图#6:
截图#7:
截图#8:
截图#9:
截图#10:
截图 #11:
截图#12:
截图#13:
截图#14:
截图#15:
截图#16:
截图#17:
截图#18:
截图#19:
截图#20:
截图#21:
截图#22:
截图#23:
于 2011-05-27T02:53:55.560 回答