2012-04-23 184 views

回答

51

下面是使用SSIS 2008 R2创建的示例包,它解释了如何将平面文件导入到数据库表中。

  • 创建一个名为Fixed_Width_File.txt的固定宽度平面文件,其数据如截图所示。屏幕截图使用Notepad ++来显示文件内容。它能够显示回车和换行符等特殊字符。 CR LF表示行分隔符回车换行

Flat file data

  • 在SQL Server数据库中,创建一个使用下SQL脚本部分提供的脚本创建名为dbo.FlatFile表。

  • 创建一个新的SSIS包并添加一个新的连接到SQL Server数据库的OLE DB连接管理器。我们假设OLE DB连接管理器被命名为SQLServer

Connection manager

  • 在包的控制流标签,放置数据流任务

Data flow task

  • 上的数据流任务双击,你将采取的数据流标签。在数据流选项卡上,放置一个平面文件源。双击平面文件源,将出现平面文件源编辑器。点击新建按钮打开平面文件连接管理器编辑器

  • 平面文件源编辑的常规部分,在连接管理器名称(比如来源)输入一个值,并浏览到平面文件的位置,然后选择文件。本示例使用路径C:\temp\Fixed_Width_File.txt中的示例文件如果文件中有标题行,则可以在标题行中输入值1以跳过文本框以跳过标题行。

Flat file connection manager editor General

  • 点击部分。根据您的选择更改字体我选择了Courier New,因此我可以用较少的滚动查看更多数据。在行宽文本框中输入值69。该值是行分隔符的所有列的宽度+ 2的总和。一旦设置了正确的行宽,您应该可以在源数据列部分正确看到固定宽度的文件数据。现在,您必须点击相应的位置才能确定列限制。请注意第4,5,6部分和下面的屏幕截图。

Flat file connection manager editor Columns

  • 点击高级部分。根据我们在上一步中的部分设置的列限制,您会注意到自动创建了5列。第五列是行分隔符。

Flat file connection manager editor Advanced

  • 重命名列名FirstNameLastNameIdDateRowDelimiter

Flat file connection manager editor Advanced Renamed

  • 默认情况下,该列将作为s et与数据类型字符串[DT_STR]。如果我们相当确定,某个列将具有不同的数据类型,我们可以在高级部分对其进行配置。我们将改变Id列是数据类型four-byte signed integer [DT_I4]和日期列的是数据类型的date [DT_DATE]

Flat file connection manager editor Advanced Id column

Flat file connection manager editor Advanced Date column

  • 点击预览部分。数据将按照列配置显示。

Flat file connection manager editor Preview

  • 点击平面文件连接管理器编辑器和平面文件连接OK将被分配到数据流任务中平面文件源。

Flat file editor connection

  • 在平面文件源代码编辑器,单击列部分。您会注意到在平面文件连接管理器中配置的列。取消RowDelimiter,因为我们不需要。

Flat file editor columns

  • 在数据流任务,放置一个OLE DB Destination。将平面文件源的输出连接到OLE DB目标。

Data flow task

  • 在OLE DB目标编辑器,选择OLE DB连接管理器命名SQLServer和设置表的名称或视图下拉到[dbo].[FlatFile]

OLE DB Destination connection

  • 在OLE DB目标编辑器上,单击Mappings部分。由于在平面文件连接管理器中的列名是一样的,在数据​​库中的列,映射将自动发生。如果名称不同,则必须手动映射列。点击确定。

OLE DB Destination columns

  • 现在,包已准备就绪。执行包将固定宽度平面文件数据加载到数据库中。

Package execution

  • 如果查询表dbo.FlatFile在数据库中,你会发现导入到数据库中的平面文件数据。

Data imported into table

该样本应该给你有关如何导入固定宽度的平面文件到数据库的想法。它并没有解释如何处理错误日志,但这应该让你开始,帮助你发现其他SSIS相关的功能,当你使用包玩。

希望有所帮助。

SQL Scripts

CREATE TABLE [dbo].[FlatFile](
    [Id] [int] NOT NULL, 
    [FirstName] [varchar](25) NOT NULL, 
    [LastName] [varchar](25) NOT NULL, 
    [Date] [datetime] NOT NULL 
) 
+1

这与我目前的问题没有关系,但我仍然赞成,只是因为你做了这么好的工作。 – SteveCav 2016-03-01 23:27:01

1

在派生列变换可以使用SUBSTRING()函数用于每个列的。 实施例:

列DerivedColumn

姓SUBSTRING(数据,startFrom,长度);

这里的名字有宽度25,所以如果我们考虑到从派生列,则第0位置,你应该给予SUBSTRING(数据,0,25)指定它;

同样,对于其他列。

1

非常好解释,西瓦!您的教程和优秀的插图指出了微软应该明确

  1. ,对于一个固定长度列的宽度必须包括回车和换行(CR & LF)字符(这是我想通了,因为预览显示行没有正确排列)
  2. 即定义一个额外列以包含那些LF字符的所有重要步骤,即使它们不会被导入。我也明白了这一点。在我开始之前,我会通过找到您的答案而受益。

如果没有这两点,运行导入将尝试给这个错误信息: 列“x列”的数据转换返回状态值4和状态文本“文本被截断或一个或多个字符在目标代码页中没有匹配。“

我已在此错误文本中添加了希望有人会在搜索错误原因时找到此页面。即使在事实发生之后,你的重要性也值得寻找!

相关问题