2017-08-16 47 views
0

我有一个输入平面文件,每个输出记录有两种类型的输入记录。第一条记录(由第一栏C标识)有一个ID和人口统计信息。第二条记录(由第一栏中的L标识)有一些财务信息。它们是管道分隔的,长度不同。数据流脚本组件中的SSIS设置变量

没有办法将所有C记录写入到一个流中,并且L记录到另一个流中,然后将它们放回到一起。所以我的解决方案是进行条件分割。当我在SSIS变量中打开C记录存储所需的所有信息时。当我点击一条L记录时,可以从变量中派生列,并使用派生列和L记录中的列来创建我的输出记录(也是平面文件)。

我已经浏览了整个互联网,无法找到C#代码来设置C记录路径的脚本组件中的变量。我想要的代码看起来像有点像

Variable.User ::姓=第2列(从输入文件) Variable.User ::姓=第3列(从输入文件)

等。

有人可以帮我吗?

感谢,

迪克

回答

1

这种想法是行不通的。当你处理每一行时,你认为你可以用变量做什么?任何对变量值做的事情都必须在填充它们的脚本中完成,因为当你离开脚本时,变量将被下一行的值填充。

然而,治疗学术你的问题,访问一个脚本组件变量的方法已经提出并在这里找到答案:How to access ssis package variables inside script component

这里是我会怎么处理这:

  1. 配置您的源组件,以便每一行都是单列
  2. 接下来做一个条件分割,将C行向下一个路径发送,并将L行向下一个
  3. 在每个路径中,使用派生列转换或脚本转换,将实际分隔符分割字符串,并为该路径中的记录类型创建实际列。
  4. 继续处理其余的处理,直到它们到达各自的目的地。
0

我喜欢使用脚本组件:

第一步是添加的数据流。

在数据流添加脚本组件,并选择源

在输入/输出: 添加您要为您的输出列信息。 (注意你将有2个独立的输出与许多列),并选择你的数据类型。

现在进入脚本编辑器。

这里是使用2个独立的If语句

string strPath = ""; 
    var lines = System.IO.File.ReadAllLines(strPath); 

foreach (string line in lines) 
{ 
    if (line.Substring(1, 1) == "C") 
    { 
     char[] delim = "|".ToCharArray() ; 
     var C_cols = line.Split(delim); 
     Output0Buffer.AddRow(); 
     Output0Buffer.FirstName = C_cols[0]; 
     Output0Buffer.LastName = int.Parse(C_cols[1]); //Note that everything is a string until cast to correct data type 
     // Keep on going 
    } 

    if (line.Substring(1, 1) == "L") 
    { 
     char[] delim = "|".ToCharArray(); 
     var L_cols = line.Split(delim); 
     Output2Buffer.AddRow(); 
     Output2Buffer.FirstName = L_cols[0]; 
     Output2Buffer.LastName = int.Parse(L_cols[1]); 
     // Keep on going 
    } 
} 

此时脚本部件将具有两个输出端,可导致下不同的路径的代码。

0

感谢您的回复。

因为我需要C记录和L记录,所以我决定将整个输入文件加载到SQL Server表中。一旦它在SQL中,我写了一个非常简单的存储过程,通过表中的记录游标,当需要的列是C记录时,将所需的列放入SQL变量,并将SQL变量和输入数据中的数据插入输出记录当它是一个L记录(我试图完全在SSIS中做同样的事情,但无法)。填充输出记录表后,编写数据流以便将表输出记录中的所有记录选择为数据流源并将它们作为数据源目标放入所需的平面文件是一件简单的事情。

迪克罗森堡

相关问题