挑战:将多个具有相同名称和架构的文本文件导入到当文件驻留在单独的文件中时,单个数据库表可能会成为一个障碍
解决方案:在 SQL Server Integration Services (SSIS) 中,您可以使用 Foreach 文件容器轻松应对这一挑战。
Foreach 文件容器:
此容器迭代文件集合,对每个文件应用一组指定的任务。通过在容器内启用“遍历子文件夹”选项,SSIS 将递归地深入子目录,处理与指定文件掩码匹配的所有文件。
应用表达式:
要在执行期间动态修改平面文件连接管理器的 ConnectionString 属性,请利用表达式。将当前文件名的值分配给 ConnectionString 表达式。这保证了文件源随着容器循环文件而变化。
变量赋值:
创建一个变量来表示 Foreach 文件容器中的当前文件。这允许后续任务访问文件的路径并根据当前正在处理的文件执行必要的操作。
数据流任务:
在容器的每次迭代内,包括一个数据流任务来处理导入的数据。此任务由一个平面文件源(读取文件)、一个行计数转换(用于计算输入行数)和一个 OLE DB 目标(将数据加载到目标表中)组成。
示例代码:
下面是更详细的代码示例来实现解决方案:
<!-- C# code using System.IO to demonstrate a different approach --> // Import System.IO for file I/O operations using System.IO; // Get the current directory string currentDirectory = Directory.GetCurrentDirectory(); // Define the source data directory string sourceDirectory = Path.Combine(currentDirectory, "SSISDATA\SO\TEST"); // Get all files with the specified extension var files = Directory.GetFiles(sourceDirectory, "*.txt", SearchOption.AllDirectories); // Iterate through each file foreach (string file in files) { // Get the file name without the extension string fileName = Path.GetFileNameWithoutExtension(file); // Load the data from the file into a data table DataTable data = GetDataFromFile(file); // Insert the data into the target table using (var connection = new SqlConnection("connection string")) { using (var command = new SqlCommand("INSERT INTO TargetTable (File, Data) VALUES (@File, @Data)", connection)) { command.Parameters.AddWithValue("@File", fileName); command.Parameters.AddWithValue("@Data", data); connection.Open(); command.ExecuteNonQuery(); } } }
上面的 C# 代码演示了另一种方法,使用系统级功能以递归方式从源数据目录中检索具有指定扩展名的所有文件并将它们插入到目标数据库表中。
以上是SSIS 如何有效地将不同子文件夹中具有相同名称和架构的多个文本文件导入到单个数据库表中?的详细内容。更多信息请关注PHP中文网其他相关文章!