我需要创建一个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)。
答案 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
在
ForEach loop
中传递此对象变量。 ResultSet变量应该捕获ControlFile.xlsx的Col2。仅为起点创建一个Sequence容器。为满载和增量负载添加2 DFD。使用约束(如下所示) image)决定运行哪个DFD。
在DFD内部,使用excel源到OLEDB目的地。
- 醇>
在Full load和incremental excel连接中使用FilePath变量作为连接属性,使其成为动态。
第1步:整体形象
步骤2: 在 DFT - 读取控制文件中,您读取FlowControl.xlsx以将其保存为RecordSet目标,放入RecordOutput变量
第三步: 您的优先约束应如下图所示(满载时为“Full”,增量负载为“Incremental”):
使用第一张图片中显示的源和目标连接。解释所有步骤有点困难,但流程很简单。
需要注意的一点是,您在增量中有额外的列,因此您需要在满载时使用“派生列”才能进行正确的映射。
此外,请确保将DelayValidation属性设置为true。
对于每个循环容器使用For each ADO Enumerator
。以下图像描述了属性:
和