Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SSIS-我可以从数据库中获取平面文件源的列架构吗?_Sql Server 2005_Ssis_Flat File - Fatal编程技术网

Sql server 2005 SSIS-我可以从数据库中获取平面文件源的列架构吗?

Sql server 2005 SSIS-我可以从数据库中获取平面文件源的列架构吗?,sql-server-2005,ssis,flat-file,Sql Server 2005,Ssis,Flat File,我们每天晚上都会收到一份来自供应商的数据导出,格式是大约10个以制表符分隔的平面文件,没有列标题。此外,供应商还为我们提供了数据库表的SQL脚本,以便我们可以将文件导入到系统中 不幸的是,供应商最近更改了平面文件的模式。每个文件都有超过150列,在SSIS中,在平面文件数据源上必须通过DB模式并调整列类型是非常耗时的,更不用说痛苦了 既然我知道数据库模式中的文件数据布局,有没有办法将其动态拉入平面文件源以正确设置列?还是我一直在手动设置所有东西?你不能通过出价来实现这一点(那太好了),但你当然可

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

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


既然我知道数据库模式中的文件数据布局,有没有办法将其动态拉入平面文件源以正确设置列?还是我一直在手动设置所有东西?

你不能通过出价来实现这一点(那太好了),但你当然可以通过对象模型来实现。我构建了一个程序,读取焦点主文件(描述固定宽度的平面文本布局),使用模板包,然后更新连接管理器以反映列布局(我将其读入自己的数据结构)。解析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(“平面文件”);
cm.Properties[“Name”].SetValue(cm,mf.SSISConnectionManagerName);
cm.Properties[“ConnectionString”].SetValue(cm,FlatFilePath);
cm.属性[“格式”].设置值(cm,“固定宽度”);
cm.Properties[“rowdimiter”].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::FilePath]”;
RWrap.IDTSConnectionManagerFlatFile90 con=cm.InnerObject作为RWrap.IDTSConnectionManagerFlatFile90;
List flds=mf.Fields();
foreach(fld中的聚焦场fld)
{
RWrap.IDTSConnectionManagerFlatFileColumn90 Col=con.Columns.Add();
(列为RWrap.IDTSName90)。名称=fld.FieldName;
Col.ColumnType=“固定宽度”;
Col.ColumnDelimiter=“”;
Col.DataType=RWrap.DataType.DT_STR;
Col.ColumnWidth=fld.ColumnWidth;
Col.MaximumWidth=fld.ColumnWidth;
}
RWrap.IDTSConnectionManagerFlatFileColumn90 EolCol=con.Columns.Add();
(EolCol作为RWrap.IDTSName90.Name=“CRLF”;
EolCol.ColumnType=“固定宽度”;
EolCol.ColumnDelimiter=“”;
EolCol.DataType=RWrap.DataType.DT_STR;
EolCol.ColumnWidth=2;
EolCol.MaximumWidth=2;
另请参见

        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;