2010-05-24 6 views
2

我们从供应商处收到每晚约10个制表符分隔的平面文件(不带列标题)的数据导出。另外,供应商为我们提供了数据库表的SQL脚本,以便我们可以将文件导入到我们的系统中。SSIS - 我可以从数据库获取平面文件源的列架构吗?

不幸的是,供应商最近更改了平面文件的模式。每个文件有150列以上,并且必须通过数据库模式并在SSIS中的平面文件数据源上调整列类型非常耗时,更不用说皇室的痛苦了。

因为我知道数据库模式中的文件数据布局,有没有什么办法可以将它动态地拉入到平面文件源来正确设置列?还是我坚持手动设置一切?

回答

1

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

请注意,如果SQL具有像int这样的本机类型,则有人必须告诉您,否则如果使用固定宽度的列,您将必须弄清楚文本文件中int的宽度。在这种情况下,您的生活可能会更容易在CSV中。

我的完整程序还将派生列转换为修剪空格并执行一些其他操作 - 生成的包然后被清理并手工测试。

下面是一些示例代码(MF是我的主文件objectmodel,该代码加载模板包,增加了一个连接管理器,把所有的字段):

 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; 
相关问题