2

我正在使用 Visual Studio 构建一个简单的 SSIS 项目,该项目需要将一个标准化列从数百个平面文件复制到它们各自的行到 SQL Server 表中。

所有平面文件都具有相同的格式,并按字母顺序放置在一个文件夹中,该文件夹循环遍历,每个文件的一列复制到 SQL Server 表的下一个可用列中。

循环过程遵循本指南。结果旨在如下工作:

file_1 
---------------------
col_1  col_2   col_3
-----  -----   -----
1      a       d
2      b       e
3      c       f

file_2 
---------------------
col_1  col_2   col_3
-----  -----   ------
1      g       j
2      h       k
3      i       l

Table_1
-------------------------------
col_1   file1_Col2   file2_col2
-----   ----------   ----------
 1         a             g
 2         b             h
 3         c             i

问题在于如何将每个平面文件的同一列映射到 SQL Server 表的下一列。我想知道是否可以创建一个可用作指向下一列的指针的字符串变量,或者是否可以调整一个属性以实现此效果?

4

2 回答 2

1

你可以做一个解决方法来实现这一点:

  1. 在 foreach 循环容器中添加一个数据流任务
  2. 在 DataFlow 任务中添加一个平面文件源,OLE DB 目标(如您提供的链接中所述)
  3. 在 Source 和 Destination 之间添加脚本组件
  4. 在脚本组件中,您必须选择 Column9 作为输入
  5. 在输入和输出选项卡中,在 Output0 中添加输出列(您必须添加在目标表中找到的所有列)
  6. 在 ReadOnly Variables 添加包含文件名的变量
  7. 在 PreExecute Phase 的脚本组件中,从 ssis 变量中读取文件名并获取文件编号(即如果 file2 则编号 =2))
  8. 将值动态分配给脚本输出列(按照我的答案@如何在 SSIS 脚本组件中按名称循环列?
  9. 将所有输出列映射到目标中的相关列

注意:这将为每个文件创建多行:

Table_1
-------------------------------
col_1   file1_Col2   file2_col2
-----   ----------   ----------
1        a        
2        b        
3        c        
1                      g
2                      h
3                      i

因此需要将所有数据导入到临时表中,然后在导入所有文件后,您必须将数据插入到目标表中:

首先插入仅包含 col1 值的行,然后从表中更新值不为空的行。

于 2017-11-21T20:58:17.103 回答
0

如果您使用循环容器来迭代文件,您可以

  1. 使用表达式任务设置具有列名和最后一个值的变量
  2. 创建一个数据流并在其中创建 ADO.Net 目标
  3. 在数据流属性中,您可以使用表达式来传递您的查询 - 该属性将被称为 [Name Of Your Ado.Net].[SqlCommand] 和值将是您的插入语句与变量的连接

希望不要太抽象

于 2017-11-21T05:35:18.867 回答