【问题标题】:SSIS - Can I get the column schema for a flat file source from a database?SSIS - 我可以从数据库中获取平面文件源的列架构吗?
【发布时间】:2011-02-23 06:12:15
【问题描述】:

我们每晚收到供应商提供的数据导出,格式为大约 10 个制表符分隔的平面文件,没有列标题。此外,供应商为我们提供了数据库表的 SQL 脚本,以便我们可以将文件导入我们的系统。

很遗憾,供应商最近更改了平面文件的架构。每个文件有超过 150 列,在 SSIS 中必须通过 DB 模式和调整平面文件数据源上的列类型非常耗时,更不用说皇家的痛苦了。

由于我知道数据库架构中的文件数据布局,有什么方法可以动态地将其拉入平面文件源以正确设置列?还是我只是坚持手动设置所有内容?

【问题讨论】:

    标签: sql-server-2005 ssis flat-file


    【解决方案1】:

    您不能通过 BIDS 来做到这一点(那太好了),但您当然可以通过对象模型来做到这一点。我构建了一个程序,它读取 Focus 主文件(描述固定宽度的平面文本布局)并使用模板包,然后更新连接管理器以反映列布局(我读入我自己的数据结构)。解析 SQL 可能会有点困难,但这肯定是半自动化的。

    请注意,如果 SQL 具有像 int 这样的原生类型,则必须有人告诉您,或者如果您使用固定宽度的列,您将不得不弄清楚 int 在文本文件中的宽度。在这种情况下,使用 CSV 会轻松很多。

    我的完整程序还进行派生列转换以修剪空格并做一些其他事情 - 然后清理生成的包并手动测试。

    这是一些示例代码(mf 是我的主文件的对象模型,此代码加载模板包,添加连接管理器,放入所有字段):

            Application App = new Microsoft.SqlServer.Dts.Runtime.Application();
            p = App.LoadPackage(TemplatePackage, null);
    
            ConnectionManager cm = p.Connections.Add("FLATFILE");
            cm.Properties["Name"].SetValue(cm, mf.SSISConnectionManagerName);
            cm.Properties["ConnectionString"].SetValue(cm, FlatFilePath);
            cm.Properties["Format"].SetValue(cm, "FixedWidth");
            cm.Properties["RowDelimiter"].SetValue(cm, "\r\n");
            cm.Properties["HeaderRowDelimiter"].SetValue(cm, "\r\n");
            cm.Properties["CodePage"].SetValue(cm, 1252);
            cm.Properties["ConnectionString"].SetExpression(cm, "@[User::FilePath] + \"\\\\\" + @[User::FileName]");
    
            RWrap.IDTSConnectionManagerFlatFile90 con = cm.InnerObject as RWrap.IDTSConnectionManagerFlatFile90;
    
            List<FocusField> flds = mf.Fields();
            foreach (FocusField fld in flds)
            {
                RWrap.IDTSConnectionManagerFlatFileColumn90 Col = con.Columns.Add();
                (Col as RWrap.IDTSName90).Name = fld.FieldName;
                Col.ColumnType = "FixedWidth";
                Col.ColumnDelimiter = "";
    
                Col.DataType = RWrap.DataType.DT_STR;
                Col.ColumnWidth = fld.SSISColumnWidth;
                Col.MaximumWidth = fld.SSISColumnWidth;
            }
    
            RWrap.IDTSConnectionManagerFlatFileColumn90 EolCol = con.Columns.Add();
            (EolCol as RWrap.IDTSName90).Name = "CRLF";
            EolCol.ColumnType = "FixedWidth";
            EolCol.ColumnDelimiter = "";
            EolCol.DataType = RWrap.DataType.DT_STR;
            EolCol.ColumnWidth = 2;
            EolCol.MaximumWidth = 2;
    

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      相关资源
      最近更新 更多