在SSIS中,Foreach控件可以循环处理选中的文件中的文件,例如sql文件,Excel文件等。下面就介绍一个比较经典的案例,将一个文件夹中包含的多个Excel文件循环导入至数据库中。
第一步:在数据库中创建一张测试表:
CREATE TABLE [dbo].[ShopInfo]( [ShopId] [varchar](255) NULL, [ShopName] [varchar](255) NULL ) ON [PRIMARY]
第二步:创建两个测试用Excel文件,所包含信息如图:
第三步:新建一个SSIS项目,如图:
第四步:项目创建完毕以后,在控制流中拖入Foreach容器控件,然后双击控件(鼠标最好放在控件图标上),此时会弹出Foeach循环编辑器,先选集合选项,然后再选择Foreach枚举选择器,点击浏览,选中刚才创建的Excel的文件夹路径,最后修改文件的后缀名为xlsx。如下图所示:
第五步:选择变量映射,新建变量,变量名为:Num,容器选择当前的包容器,这里要注意一下,容器实际上指的是这个变量的作用范围,如果范围没有指定正确,这个变量是没有作用的,最后给一个默认值:0。如图所示:
第六步:在Foreach控件中,拖入一个数据流任务,然后双击这个任务,之后会进入数据流任务的工作界面,此时右侧会有一系列的控件,在数据流控件中找到Excel源,其意思就是说数据的来源是Excel,拖入Excel源控件之后,双击控件,进行数据源的设置。点击新建,再点浏览,选中之前准备好的Excel文件,任意选中一个即可。如图所示:
第七步:此时需要拖入一个数据转换控件,因为Excel中的字符中Uncoide,而我们刚才建立的表所包含的字段是varchar类型,如果不进行数据转换,数据是不会导入到数据库中,需要把数据转换成string。如图所示:
第八步:在数据流目标中,找到OLE DB数据源控件,拖入到工作界面,然后和数据转换控件进行连接,连接方式就是从数据转换控件点击一个绿色的箭头,连接到OLE DB数据源控件,连接之后,双击OLE DB数据源控件,进行目标源的设置,此时需要新建一个OLE DB连接管理器,其意思就是选择之前在第一步创建的ShopInfo所在数据库。连接管理器创建成功以后,再点击映射,此时控件已自动将需要映射的列映射好了,原因是因为我们之前进行的数据转换,所取的字段名和目标库中的表所包含的字段名是一样的。如图:
第十步:最关键的一步。右击Excel连接管理器,在弹出的对话框中,选中属性。在属性列表中找到Expresssions属性,在属性表达式编辑器中,在属性这一栏中,选择ExcelFilePath,在表达式这一栏中,选中之前我们建立的变量Num,然后点击确定。此时Excel报错了,这是正常的,因为改变了ExcelFilePath属性,我们只需要右击Excel数据源控件,找到属性ValidateExternalMedaData,默认为True,把它改为False,让Excel忽略这个错误,大功告成,如图所示:
第十一步:运行刚才建立的Package包即可。运行结果如下:
总结:在使用Foeach控件时,有两点需要注意,第一就是Foreach控件,变量映射,指定好变量,第二点,也是最重要的一点,就是修改Excel数据源的属性ValidateExternalMedaData为False,让控件忽略修改ExcelFilePath所带来的错误。
Foreach控件使用