SSIS:平面文件默认长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSIS:平面文件默认长度相关的知识,希望对你有一定的参考价值。

我每天必须导入大约50种不同类型的文件。其中一些有几列,有些可以容纳250列。

平面文件连接始终将所有列默认为50个字符。有些列的长度可能超过50个字符,当然最终会出错。

目前我正在使用notepad ++进行愚蠢的搜索替换 - 打开所有SSIS包,替换:

DTS:MaximumWidth="50"

通过

DTS:MaximumWidth="500"

这是一个烦人的解决方法。是否有可能将flatfile字符串列的默认长度设置为某个值?

我正在使用Microsoft Visual Studio Professional 2015和SQL Server Data Tools 14.0.61021.0进行开发

谢谢!

答案

我认为没有办法从SQL Server数据工具实现这一目标。

但是你可以做一些解决方法来实现这个目标:

  1. 最简单的解决方案,在平面文件连接管理器 - 高级选项卡中,选择所有列(使用Ctrl键)并在一次编辑中更改它们的数据长度属性。 (详见@MikeHoney答案)
  2. 您可以使用BIML (Business Intelligence Markup Language)创建ssis包,如果您是BIML的新手,您可以访问BIML Script网站获取详细的教程。
  3. 您可以创建一个小应用程序,循环遍历文件夹中的.dtsx文件,并使用常规DTS:MaximumWidth="50"函数或使用正则表达式将DTS:MaximumWidth="500"替换为String.Replace。 (你可以阅读我的答案@ Automate Version number Retrieval from .Dtsx files,看看使用正则表达式读取.dtsx文件的例子)

函数读取和替换dtsx文件的内容(Vb.Net)

Public Sub FixDTSX(byval strFile as string)

    dim strContent as string = string.empty

    Using sr as new Io.StreamReader(strFile)

        strContent = sr.ReadToEnd()

        sr.Close()

    End Using

    strContent = strContent.Replace("DTS:MaximumWidth=""50""","DTS:MaximumWidth=""500""")

    Using sw as new Io.StreamWriter(strFile,False)

        sw.Write(strContent)

        sw.Close()

    End Using

End Sub
另一答案

有一种方法可以使用标准的Visual Studio SSDT UI实现您想要的功能,尽管它非常模糊。自SQL Server 2005以来,AFAIK适用于此编辑器的每个版本。

打开包后,在“连接管理器”窗格中,右键单击“平面文件连接”,然后选择“编辑”。然后导航到“高级”页面。然后多选要更改的列(例如,按住Shift键单击一个范围或按住Ctrl键单击特定的一组)。现在,右侧显示的属性将应用于所有选定的列。

在下面显示的示例中,我已将所有选定列设置为255的宽度。

Flat File Connection Manager Editor

另一答案

埃斯特万,

我建议你使用Object Model API,它允许你以编程方式开发SSIS包。使用它,您可以使用任何允许您从文本文件中收集数据/元数据的.net代码。此外,假设是,由于您使用的是SSIS,因此您可能已经熟悉在C#/ VB.Net中编写代码

现在,如果您刚开始使用对象模型API,那么将会有一个巨大的学习曲线(但如果SSIS是您的日常生活,那么值得学习它)。如果您现在没有时间投资,我建议您使用我编写的库(称为Pegasus),这极大地简化了如何使用Object Model API;您可以以几乎声明的方式创建包(使用C#)。

在Github上,有一个示例演示如何创建一个包,该包在给定文件夹中加载具有不同模式的任意数量的文本文件。见here;特别是方法GenerateProjectToLoadTextFilesToSqlServerDatabase()。

在该示例中,我使用名为lumenworks.framework的第三方.Net库来探测分隔文件并获取其元数据。使用这个库,我得到列的名称;我还根据对第一个'n'行的采样来推断数据类型和长度。 (在我的代码中,我只推断整数,日期和字符串;如果您有更多数据类型,请相应地添加相关代码)。或者,您可以为所有列指定一种特定的数据类型和长度(看起来要使用500个字符串)。 [或者(在某些情况下),您可能在excel文件/配置文件中可以使用此元数据。]然后,我使用此元数据以编程方式配置文本文件连接管理器。

您可以从Github下载代码,并通过指定源文件的位置来运行DataFlowExample,并查看它到达了多远。

另一个建议是Biml,但我不确定你是否可以将自己的/第三方完整的C#代码(不仅仅是代码片段)整合到Biml工作流程中。如果可以,那就去Biml吧。

如果您有任何疑问,请告诉我。

以上是关于SSIS:平面文件默认长度的主要内容,如果未能解决你的问题,请参考以下文章

即使输入数据错误,SSIS 包也不会失败

使用 SSIS 脚本任务将数据从多个 SQL 表导出到不同的平面文件

SSIS 包顽固的平面文件连接管理器

平面文件到 SSIS 中的 Netezza 加载

问题将数值数据导出到平面文件,SSIS

如何使用 SSIS 从平面文件中删除重复的行?