如何从不同的文件源加载数据,目标表应该有一个派生列作为File_Name,并且应该显示文件名,文件是从中加载到sql表中的数据。
例如: file1.txt包含
emp_id \ temp_name 1 abc
file2.txt包含
emp_id \ temp_name 2 adc
输出表应该包含 emp_id emp_name file_name 1 abc file1 2 adc file2
答案 0 :(得分:0)
我写了几个SSIS包,正是你所寻求的。假设您正在应用带有“Foreach文件枚举器”的foreach循环(从文件夹中具有特定扩展名的每个文件中读取),您可以在Collection下设置一个对象变量,该变量将用作存储所有文件名的数组(包括完整路径)然后在Variable Mappings下设置第二个变量类型字符串(索引= 0),它将临时存储文件名(再次包括完整路径)。称之为FileWithFullPath。
现在需要应用一些步骤,因为您需要将文件名发送到数据库字段,并且文件名不能包含完整路径或扩展名(c:\ documents \ file1.txt变为file1)。为此,您需要按照定义的顺序将以下内容添加到foreach循环中。
添加脚本任务。在Script for ReadOnlyVariables下,添加FileWithFullPath变量。在ReadWriteVariables下,创建一个名为FileNameOnly的新变量。在这里,我们将读取当前包含完整路径的文件名,然后返回除路径和扩展名之外的文件名。选择编辑脚本,在这里您将应用以下C#代码来实现此目的。
添加“using System.IO;”到上面的区域命名空间。
在public void Main()下的大括号内,添加以下内容:
string PathandFileName = Dts.Variables["User::FileWithFullPath"].Value.ToString();
string FileNameWithExtension = Path.GetFileName(PathandFileName); //trim path
string FileNameOnly = Path.GetFileNameWithoutExtension(FileNameWithExtension); //trim extension
将最终字符串值分配给新变量。
Dts.Variables["User::FileNameOnly"].Value = FileNameOnly;
保存并构建代码,然后退出。
最后,在“控制流”选项卡下,将一个数据流任务添加到foreach循环中。选择“数据流”选项卡,添加源和目标,但在两者之间添加“派生列”任务。在这里,您将创建一个名为FileName的新列,并将其刚刚填充在名为User :: FileNameOnly的C#代码中的新变量拖入其表达式中。然后,您将映射到目标数据库表中的Filename列以及从该文件中读取的其他列。
试一试,如果您有任何问题,请告诉我。
感谢。