0

我有一项复杂的任务需要完成。它以前运行良好,因为只有一个文件,但现在正在改变。每个文件都有一个长行,首先将其批量插入到临时表中。从这里我应该将文件名保存到另一个表中,然后插入临时表数据的分解部分。这不是问题。我们可能一次只加载一个文件甚至多个文件。需要发生的是:

  1. 第一个 SSIS 任务是一个执行一些检查的脚本任务。第二个任务准备文件列表。
  2. 暂存表被截断。
  3. 第三个任务当前是一个 Foreach 循环容器任务,它使用文件列表中的文件并对其进行处理:
    • 使用批量插入任务将文件加载到表中。
    • 文件名需要作为变量传递给下一个进程。这是以前通过 C# 任务完成的,但现在有点复杂,因为可能有多个文件并且每个文件名都需要单独保存。
    • 最后一个任务是一个 SQL 任务,它执行一个以文件名作为输入变量的存储过程。

我的问题是之前只有一个文件。这很容易。现在最好的方法是什么?

4

3 回答 3

1
  1. 在导入文件的数据流任务中,创建派生列。使用文件名的系统变量值填充它。将文件名加载到同一个表中。

  2. 使用执行 SQL 任务将不同的文件名列表检索到记录集(对象类型变量)中。

  3. 使用 For Each Loop 容器循环遍历记录集。将代码放入容器中。代码将从循环中接收文件名作为变量的值并处理文件。

  4. 使用 For Each Loop 容器中的 Execute SQL 任务调用 SP。将文件名作为参数传递,例如:

    执行 sp_MyCode 参数 1,参数 2,?

在哪里 ?将文件名 INPUT 作为字符串传递

编辑

要使平面文件连接拾取由变量指定的文件 - 使用平面文件连接的连接字符串属性

  1. 选择FF Connection,右键选择属性

  2. 单击表达式的空白字段,然后单击出现的省略号。使用表达式,您可以使用变量定义其中列出的对象的每个属性。SSIS 中的许多对象都可以指定表达式。

  3. 添加一个表达式,选择连接字符串属性并定义一个带有文件绝对路径的表达式(为了安全起见,它也可以是一个 UNC 路径)。

于 2013-06-05T13:21:16.893 回答
0

在暂存表中添加一个列 - FileName 在 SSIS 变量中捕获文件名(使用表达式),然后在每个循环中运行类似的内容:

UPDATE StagingTable SET FileName=? WHERE FileName IS NULL

你为什么要搞乱C#?根据您的描述,完全没有必要。

于 2013-06-05T23:17:19.120 回答
0

以上所有操作都可以在脚本任务本身中使用 C# 代码来完成。您可以逐个遍历所有文件,并为每个文件: 1. 将数据批量复制到暂存区 2. 将文件名插入另一个表

您可以根据您的要求和所需的执行流程修改逻辑。

于 2013-06-05T13:44:03.463 回答