使用动态生成的列加载文件

时间:2017-07-25 07:50:24

标签: sql sql-server ssis sql-server-2014

我需要创建一个SSIS项目,将每日批量的150个文件加载到SQL Server数据库中。每个批处理始终包含相同的150个文件,批处理中的每个文件都具有唯一的名称。每个文件也可以是完整或增量类型。增量文件比完整文件多一列。每个批处理包含一个控制文件,指出文件是完整文件还是增量文件。请参阅下面的文件示例:

完整档案

|  SID |  Name  |  DateOfBirth  |
|:---: | :----: | :-----------: |
| 1    | Samuel |   20/05/1964  |
| 2    | Dave   |   06/03/1986  |
| 3    | John   |   15/09/2001  |

增量文件

|  SID |  Name  |  DateOfBirth  |  DeleteRow   |
|:---: | :----: | :-----------: | :----------: |
| 2    |        |               |  1           |      
| 4    | Abil   |   19/11/1993  |  0           |
| 5    | Zainab |   26/02/2006  |  0           |

我想避免为每个文件创建2个包(完整和增量)。

有没有办法根据控制文件中的文件类型动态生成每个源/目标组件中的列列表?例如,当文件类型为增量时,列列表应包含额外列(DeleteRow)。

2 个答案:

答案 0 :(得分:1)

我可以想到两个解决方案。

1)在软件包的开头有一个脚本任务,用于查看这是增量加载还是满载。如果是满载,请让它循环遍历所有文件,并为每个文件添加一个全部为零的“DeleteRow”列。然后,您可以使用相同的列列表。

2)使用BiML在运行时根据可用的元数据动态生成包。

答案 1 :(得分:1)

我们假设我的ControlFile.xlsx是:

Col1        Col2
File1.xlsx  Full
file2.xlsx  Incremental

<强>流量

  

1.创建一个DFT,其中ControlFile.xlsx被捕获在一个对象变量中。 Source : Control connection, Destination : RecordSet Destination

     
      
  1. ForEach loop中传递此对象变量。 ResultSet变量应该捕获ControlFile.xlsx的Col2。

  2.   
  3. 仅为起点创建一个Sequence容器。为满载和增量负载添加2 DFD。使用约束(如下所示)   image)决定运行哪个DFD。

  4.   
  5. 在DFD内部,使用excel源到OLEDB目的地。

  6.   
  7. 在Full load和incremental excel连接中使用FilePath变量作为连接属性,使其成为动态。

  8.   

第1步:整体形象

img_main

步骤2:  在 DFT - 读取控制文件中,您读取FlowControl.xlsx以将其保存为RecordSet目标,放入RecordOutput变量

img2

第三步: 您的优先约束应如下图所示(满载时为“Full”,增量负载为“Incremental”):

img3

使用第一张图片中显示的源和目标连接。解释所有步骤有点困难,但流程很简单。

需要注意的一点是,您在增量中有额外的列,因此您需要在满载时使用“派生列”才能进行正确的映射。

此外,请确保将DelayValidation属性设置为true。

对于每个循环容器使用For each ADO Enumerator。以下图像描述了属性:

img

imgx