假设我们有 10 个不同的文件,需要加载到 10 个不同的表中。表名应与文件名相同。建议一些使用 SSIS 包一次加载所有文件的有效方法?
2 回答
这可以在 SSIS 中使用 BCP 命令、两个 SQL 任务和一个 Foreach 容器轻松实现。
在数据库中为各自的平面文件创建表模式。
现在在数据库中创建一个新表(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 任务”</p>
创建一个名为“tbl_variable”的数据类型对象的新变量。
现在编辑“执行 SQL 任务”并在一般选项卡中建立 OLE DB 连接并在 SQL 语句选项卡中写入以下查询。
// 从 dbo.Path_table 中选择 Table_name,File_path,File_name //
现在在 SQL 任务中将结果集属性更改为“完整结果集”</p>
在“执行 SQL 任务”的左窗格中,选择“结果集”将查询结果映射到我们的变量(tbl_variable)。
现在拖放“每个容器”。在左侧窗格中选择“collection”,从下拉列表中选择“Enumerator”作为“For Each ADO Enumerator”,然后为 ADO 对象源变量选择 variable(tbl_variable)。最后选择“枚举模式”为“第一个表中的行”。
'tbl_variable' 结果有三列。现在在“变量映射”窗格中,将三列结果映射到三个新变量(数据类型为 varchar),即 tbl_name、file_path 和 file_name,索引号分别为 (0,1,2),因为这将是下一个参数映射SQL 任务(加载数据) 现在在“对于每个容器”中执行一个“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。
- 创建 SSIS 包。
- 创建 10 个平面文件连接(对于每个文件)。
在每个中创建 10 个 Dataflow 对象:
- 平面文件源(选定的 txt 文件)
- 数据转换元素
- 派生列元素
- Ole DB 目标元素(在此元素中,您需要在表选择组合框附近按下“新建”按钮。SSIS 将为您提供带有表创建代码的 SQL 查询。文件中将包含所有列,同时编辑表名称)
在插入表之前,创建 SQL 任务以截断这些表。您可能需要编辑一些数据类型,因为 SSIS 几乎总是提供字符串类型 -varchar。