SSIS:平面文件默认长度

SSIS: Flat File default length

我每天要导入大约 50 种不同类型的文件。其中一些只有几列,一些包含多达 250 列。

平面文件连接始终将所有列默认为 50 个字符。 有些列可能超过 50 个字符,当然会以错误告终。

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

DTS:MaximumWidth="50"

来自

DTS:MaximumWidth="500"

这是一个烦人的解决方法。 是否可以将平面文件字符串列的默认长度设置为特定值?

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

进行开发

谢谢!

埃斯特万,

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

编写代码

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

在 Github 上,有一个示例展示了如何创建一个包以在给定文件夹中加载任意数量的具有不同架构的文本文件。参见here;特别是方法 GenerateProjectToLoadTextFilesToSqlServerDatabase().

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

您可以从 Github 和 运行 DataFlowExample 下载代码,方法是指定您的源文件所在的位置并查看它能为您提供多少。

另一个建议是 Biml,但我不确定您是否可以将您的 own/third 方完整的 C# 代码(不仅仅是片段)合并到 Biml 工作流程中。可以的话就用Biml吧

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

我认为 SQL 服务器数据工具无法实现此目的。

但您可以采取一些解决方法来实现此目的:

  1. 最简单的解决方案,在平面文件连接管理器 - 高级选项卡中,select 所有列(使用 Ctrl 键)并在一次编辑中更改所有列的数据长度 属性。 (详见@MikeHoney 回答)
  2. 您可以使用 BIML (Business Intelligence Markup Language) to create ssis package, if you're new to BIML you can access to BIML Script 网站获取详细教程。

  3. 您可以创建一个小型应用程序,循环遍历文件夹中的 .dtsx 个文件,并使用普通 String.Replace 函数将 DTS:MaximumWidth="50" 替换为 DTS:MaximumWidth="500" 或使用正则表达式。 (您可以阅读我的回答@ 以查看使用正则表达式读取 .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 以来,它适用于此编辑器的每个版本。

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

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