假设我们有10个不同的文件,需要加载到10个不同的表中。表名应与文件名相同。建议使用SSIS包一次加载所有文件的有效方法吗?
答案 0 :(得分:0)
在每个对象中创建10个Dataflow对象:
在插入表之前,创建SQL任务以截断这些表。 您可能需要编辑一些数据类型,因为几乎总是SSIS提供字符串类型-varchar。
答案 1 :(得分:0)
这可以使用BCP命令,两个SQL任务和一个Foreach容器在SSIS中轻松实现。
在数据库中为各个平面文件创建表Schema。
现在在数据库中创建一个新表(Path_Table),该表应该有三列,如下所示。
第1列:Table_name第2列:File_path第3列:File_name
在(Path_Table)
中插入数据的示例Insert into Path_Table Values (‘dept_table’,’d:\\’,’department.txt’)
它适用于'n'个表。
此打开后的SSDT创建一个新的SSIS包。现在拖动“执行SQL任务”
创建数据类型为object的名称“tbl_variable”的新变量。
现在编辑“执行SQL任务”并在常规选项卡中创建OLE DB连接并在SQL语句选项卡中写下面的查询。
//从dbo.Path_table //
中选择Table_name,File_path,File_name现在在SQL任务中将结果集属性更改为“完整结果集”
在“执行SQL任务”的左窗格中,选择“结果集”查询的映射结果到我们的变量(tbl_variable)。
现在拖放“为每个容器”。在左侧窗格中选择“collection”,从下拉列表中选择“Enumerator”作为“For Each ADO Enumerator”,然后为ADO对象源变量选择变量(tbl_variable)。最后选择“枚举模式”为“第一张表中的行”。
'tbl_variable'结果有三列。现在在“变量映射”窗格中将三列结果映射到三个新变量(数据类型为varchar),即tbl_name,file_path和file_name,索引号分别为(0,1,2),因为它将成为下一个的参数映射SQL任务(加载数据) 现在在“For each container”里面取一个“SQL任务”。在“SQL命令”中 将查询写为:
declare @tblname sysname=?
declare @dir varchar(500)=?
declare @file_name varchar(500)=?
declare @SQLstring varchar(2000)
set @SQLstring='BCP AdventureWorks2012.'+@tblname+' IN '+@dir+'\'+@file_name+'.txt -c -t, -S PRINHYLTPDL0937 -T -R'
exec xp_cmdshell @SQLstring
go
在上面的查询中根据您的要求更改数据库和其他。 在参数映射窗格的“SQL任务”中,Map先前创建的三个变量(tbl_name,file_path和file_name)结果作为上述查询的输入,参数名称分别为0,1和2。