SSIS:平面文件默认长度

时间:2017-07-07 07:19:49

标签: sql-server ssis etl sql-server-data-tools ssis-2016

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

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

目前我正在做一个愚蠢的搜索并用记事本++替换 - 打开所有SISS包,替换:

DTS:MaximumWidth="500"

通过

composer require elibyy/tcpdf-laravel

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

我正在使用Microsoft Visual Studio Professional 2015和SQL Server数据工具14.0.61021.0进行开发

谢谢!

3 个答案:

答案 0 :(得分:4)

我认为没有办法从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文件的例子)

  4. 功能读取和替换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
    

答案 1 :(得分:4)

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

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

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

Flat File Connection Manager Editor

答案 2 :(得分:1)

埃斯特,

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

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

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

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

您可以从Github下载代码,并通过指定源文件的位置来运行DataFlowExample,并查看它的存在距离。

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

如果您有任何疑问,请与我们联系。