ssis:向同一sql server表中导入循环导入多张access表时,需要增加计算列的处理方法。

来源:互联网 发布:淘宝亚马逊礼品卡 编辑:程序博客网 时间:2024/06/04 17:49

问题:将"e:/a/"的所有access文件中的表x合并到sql server2008 某数据库中的表y中。所有的表x结构都是相同的,而表y比表x多了一列,就是access的文件名。
表x样例:


具体解决步骤:
1、 在sql server 2008下创建数据库"db"。
2、 创建y表:
create table y(
编号 int,
值 int,
文件名 nvarchar(50)
)
3、 在SSIS中编写数据传输包,功能是将E:/SJFX中的所有Access文件中的"凭证库表"导入到sql server2008下的数据库"凭证合并库"中的"凭证库"表中。导入时除了导入原凭证库中的列时,还要再导入文件名列。以备后面处理只用。具体操作步骤如下:
(1) 打开ssis,为了便捷,先利用"导入导出向导"设置将"e:/a/"下的一个access文件(随便指定一个)导入到表x中。
(2) 打开控制流,先在设计器中放置如图1所示的控件。每次循环执行一个access文件的传输,先将access中的表x的所有列导入到sql server中的表y中,这部分有"数据流任务1"完成;再为表y的"文件名"列赋值,这部分由"执行SQL任务"完成。

图1
(3) 设置"Foreach循环容器"
双击"Foreach循环容器",设置如图2和图3。其中图2中选择的文件夹是要循环读取的access文件所在文件夹,检索文件类型设置为"完全限定名字",这样图3中新建的变量@[User::filepath]的值就为当前循环所读取access文件的路径加文件名。

图2

图3
(4) 设置"执行SQL任务"
双击"执行SQL任务"。先创建参数映射将用户变量@[User::filepath]的值传递给参数@P。如图4所示。再设置常规页,如图5所示。

图4

图5
(5) 打开数据流,如图6所示。

图6

(6) 设置连接管理器
选中连接管理器中的"SourceConnectionOLEDB",将其属性"ConnectionString"值删空,然后在表达式生成器中添加表达式"ConnectionString",其值为:""Data Source="+ @[User::filepath] +";Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;""最后检查下"目标"中的列对应关系有没有问题。
(7) 包已建好。执行完毕后,可将所有的access中的表x数据导入sql server的表y中,且文件名列为对应access文件的物理名称(路径+名称)。

总结:
第一次做时没有考虑用第3步的步骤4。而是在数据源连接管理器中,选择sql 命令访问模式,书写sql语句如下:
SELECT @[user::filepath], 编码,值 FROM x
但是系统总是提示格式错误。估计在数据流端的sql命令里不能有计算列,所以改变方法,在控制流的"数据流任务"下面加了一个"执行sql任务"。

原创粉丝点击