在SSIS包中实现CSV导入并添加对应文件名至数据库行的问询
解决CSV导入时追加文件名到每条记录的方法
核心思路
别把Script Component当成独立数据源去和CSV行集合并,而是把它作为转换组件,直接将文件名变量的值追加到CSV的每一行数据里,这样就能让每条记录自然关联对应的文件名。
具体操作步骤
- 确认ForEach循环变量配置
- 保证ForEach循环的
Current File变量(比如命名为User::CurrentFileName)能正确捕获当前遍历的CSV文件路径或文件名。
- 保证ForEach循环的
- 添加转换类型的Script Component
- 把CSV源的输出连接到Script Component,选择转换类型(不是源或目标)。
- 配置变量读取权限
- 进入Script Component编辑器,切换到Script选项卡,在
ReadOnlyVariables里添加你的User::CurrentFileName变量,让脚本可以读取这个变量的值。
- 进入Script Component编辑器,切换到Script选项卡,在
- 新增文件名输出列
- 切换到Input Columns选项卡,勾选CSV源中需要传到目标表的所有列。
- 切换到Input and Outputs选项卡,展开
Input 0下的Output Columns,点击添加列,命名为FileName(或自定义列名),数据类型选DT_WSTR,长度根据文件名长度设置(比如255)。
- 编写赋值脚本
- 点击Edit Script,在脚本编辑器的
Input0_ProcessInputRow方法里,添加代码把变量值赋值给新增列:
(VB.NET版本代码类似:// C#示例 public override void Input0_ProcessInputRow(Input0Buffer Row) { // 直接赋值完整路径 Row.FileName = Variables.CurrentFileName; // 如果只需要文件名(不含路径),用下面的代码: // Row.FileName = System.IO.Path.GetFileName(Variables.CurrentFileName); }Row.FileName = Variables.CurrentFileName)
- 点击Edit Script,在脚本编辑器的
- 连接OLE DB目标
- 把Script Component的输出直接连到OLE DB目标,将包括
FileName在内的所有列映射到目标表的对应字段即可。
- 把Script Component的输出直接连到OLE DB目标,将包括
为什么之前的方法无效
- UNION ALL/Merge是用来合并结构相同的两个行集,你把Script Component当数据源时,它只会生成单行(甚至空行),和CSV的多行无法匹配关联,所以出现NULL值。
- 转换类型的Script Component会遍历CSV的每一行,给每行都追加文件名变量的值,刚好实现每条记录和对应文件名的关联。
内容的提问来源于stack exchange,提问作者Optimaximal
相关产品推荐
相关产品推荐

