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
Ssis 将具有派生列的多个平面文件中的数据加载到数据库_Ssis_Packages - Fatal编程技术网

Ssis 将具有派生列的多个平面文件中的数据加载到数据库

Ssis 将具有派生列的多个平面文件中的数据加载到数据库,ssis,packages,Ssis,Packages,如何从不同的文件源加载数据,目标表应该有一个派生列作为file_Name,并且应该为数据加载到sql表的文件所在的行显示文件名 例如: file1.txt包含 emp_id emp_名称 1 abc file2.txt包含 emp_id emp_名称 2 adc 输出表应包含 emp\u id emp\u name文件名 1 abc文件1 2 adc文件2我已经编写了几个SSI包,它们完全符合您的要求。假设使用foreach文件枚举器应用foreach循环,读取文件夹中具有特定扩展名的每个文件,

如何从不同的文件源加载数据,目标表应该有一个派生列作为file_Name,并且应该为数据加载到sql表的文件所在的行显示文件名

例如: file1.txt包含

emp_id emp_名称 1 abc

file2.txt包含

emp_id emp_名称 2 adc

输出表应包含 emp\u id emp\u name文件名 1 abc文件1
2 adc文件2

我已经编写了几个SSI包,它们完全符合您的要求。假设使用foreach文件枚举器应用foreach循环,读取文件夹中具有特定扩展名的每个文件,则可以在“集合”下设置一个对象变量,该变量将用作存储所有文件名(包括完整路径)的数组,然后在“变量映射”下设置第二个字符串类型的变量索引为0时,将临时存储文件名的文件将再次包含完整路径。称之为FileWithFullPath

现在需要应用一些步骤,因为您需要将文件名发送到数据库字段,并且文件名不得包含完整路径或扩展名c:\documents\file1.txt变为file1。为此,您需要按照定义的顺序向foreach循环中添加以下内容

添加脚本任务。在ReadOnlyVariables脚本下,添加FileWithFullPath变量。在ReadWriteVariables下,创建一个名为FileNameOnly的新变量。在这里,我们将读取当前包含完整路径的文件名,然后返回不包含路径和扩展名的文件名。选择编辑脚本,在这里您将应用以下C代码来实现这一点

使用System.IO添加;要在上面区域名称空间

在public void Main下的大括号内,添加以下内容:

)

将最终字符串值指定给新变量

Dts.Variables["User::FileNameOnly"].Value = FileNameOnly;
保存并生成代码,然后退出

最后,在“控制流”选项卡下,将数据流任务添加到foreach循环中。选择“数据流”选项卡,添加源和目标,但在两者之间添加派生列任务。在这里,您将创建一个名为FileName的新列,并将刚刚在名为User::FileNameOnly的C代码中填充的新变量拖到其表达式中。然后,您将映射到目标数据库表中的Filename列以及从该文件读取的其他列

试试看,如果你有任何问题,请告诉我


谢谢

嗨,谢谢你的帮助。但是我想在没有脚本任务的情况下解决这个问题。如果您能帮上忙,我们将不胜感激。无论子文件夹和扩展名的数量如何,无论文件名的长度是三个或更多字符,C脚本都是动态修剪路径的最佳方式。否则,唯一的替代方法是使用派生列中的表达式应用一些硬编码。您可以应用RTRIM来修剪句点和三个字符的扩展名,然后使用令牌来计算提取文件名所需的\\文件夹分隔符。请参阅令牌链接示例:
Dts.Variables["User::FileNameOnly"].Value = FileNameOnly;