我有一个输入平面文件,每个输出记录有两种输入记录。第一个记录(由第一列中的C标识)具有ID和人口统计信息。第二条记录(由第一栏中的L标识)有一些财务信息。它们是由管道划界的,长度不同。
没有办法将所有C记录写入一个流,L记录到另一个流,然后将它们重新组合在一起。所以我的解决方案是进行条件拆分。当我在C记录存储中找到SSIS变量中所需的所有信息时。当我点击L记录时,从变量中生成派生列,并使用派生列和L记录中的列来生成我的输出记录(也是平面文件)。
我已经浏览了整个互联网,无法找到C#代码来设置C记录路径的脚本组件中的变量。我希望代码看起来像
Variable.User :: Firstname = Column 2(来自输入文件) Variable.User :: Lastname = Column 3(来自输入文件)
等
有人可以帮帮我吗?
谢谢,
迪克
答案 0 :(得分:1)
这个想法不起作用。您认为在每行处理后您可以对变量做什么?你用变量值做的任何事都必须在填充它们的脚本中完成,因为当你离开脚本时,变量将被下一行的值填充。
但是,将您的问题视为学术问题,在脚本组件中访问变量的方式已在此处提出并回答:How to access ssis package variables inside script component
以下是我将如何做到这一点:
答案 1 :(得分: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
}
}
此时,脚本组件将有两个输出,可以导致不同的路径。
答案 2 :(得分:0)
感谢您的回复。
由于我需要一个C记录和之后的L记录,我决定将整个输入文件加载到SQL Server表中。一旦它在SQL中,我编写了一个相当简单的存储过程来游标表中的记录,将所需的列放入SQL变量中,当它是C记录时,将数据从SQL变量和输入数据插入到输出记录中当它是L记录时(我在SSIS中完全尝试做同样的事情但却无法做到)。在填充输出记录表之后,将数据流写入SELECT表格输出记录中的所有记录作为数据流源并将它们作为数据源目标放入所需的平面文件中是一件简单的事情。
迪克罗森伯格