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

如何解决如何使用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:     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?