如何使用SSIS加载在EDI 823密码箱文件中找到的父子数据?

问题描述

| 我必须使用ssis将EDI 823锁盒文件加载到sql服务器数据库中。谁能告诉我如何处理不同线条之间的父子关系。     

解决方法

更新:以下答案仅显示了将简单的父子数据加载到SQL Server中的示例。 检查此链接以查看如何使用SSIS加载实际的“ 0”文件。 这是一个可能的选项,可用于加载父子/标题详细信息。 在这种情况下,我有一个平面文件,其中包含与国家和州有关的标头详细信息。以“ 1”开头的行表示标题行,以“ 2”开头的行表示明细。有关示例文件内容,请参阅屏幕截图1。 分步过程: 在数据库中(我选择了SQL Server),创建两个名为
dbo.Header
dbo.Detail
的表。有关这些表的创建脚本,请参见第5节。在此示例SSIS包的帮助下,我们将通过读取平面文件内容来填充这些表。 在SSIS包上,拖放两个数据流任务。将它们分别命名为
Header
Detail
。请参阅屏幕快照2,以了解如何放置它们。 创建一个名为string8 data的数据类型字符串的变量。将值“ 1”分配给变量。请参阅屏幕截图3。 配置Header数据流任务,如屏幕截图4所示。下面的步骤5-11描述了Header数据流任务中的每个转换任务。
Read File
是平面文件源,它被配置为读取屏幕快照#1中所示的文件。屏幕快照#5-#9中显示了此任务中使用的平面文件连接的配置设置。
Data clean up
是派生的列转换任务,用于删除输入中存在的任何空格。请参阅屏幕截图10。
Segregate data
是脚本组件转换任务。拖放脚本组件时,选择“转换”选项。请参阅截图11,以了解如何在此任务上配置ѭ13。请参阅屏幕截图12,以了解如何在此任务上配置ѭ14。输出列“ 15”的数据类型为DT_BOOL,输出列HeaderKey为数据类型的DT_STR,长度为50。在左侧选择“ 16”,然后单击“ 17”。将脚本组件中的代码替换为脚本任务组件部分中使用的代码下给出的代码。 顾名思义,“ 18”是组播转换任务。它没有任何特殊配置。
Fetch Detail
是条件分割变换任务。请参阅屏幕快照#13来配置此任务。 “ 6”是配置为连接到新创建的表dbo.Header的OLE DB目标。屏幕快照#14中显示了此任务的字段映射。
Staging
是配置为写入CSV文件的平面文件目标。屏幕截图#15-#16中显示了此连接管理器的配置。登台连接管理器中有四列。
Code
Value
列的数据类型为DT_STR,长度为255;
IsHeader
的数据类型为DT_BOOL;
HeaderKey
的数据类型字符串的长度为50。
Staging
任务的字段映射如屏幕快照17所示。 然后,我们继续下一个数据流任务task7。 配置细节数据流任务,如屏幕截图18所示。下面的步骤14-16描述了Detail数据流任务中的每个转换任务。
Staging
是平面文件源,配置为使用在步骤#11中创建的
Staging
连接管理器。 “ 30”是配置为指向表dbo.Header的查找转换。屏幕快照#19中显示了此任务的列配置。 “ 7”是配置为连接到新创建的表dbo.Detail的OLE DB目标。屏幕快照#20中显示了此任务的字段映射。 屏幕截图#21和#22显示了数据流任务Header和Detail的执行。 屏幕截图#23显示了加载到表中的数据。 希望能有所帮助。 脚本任务组件中使用的代码(在上面的步骤#7中提及): 只能在
SSIS 2008 and above
中使用的C#代码。 。
/*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,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: