SSIS - 加载平面文件,将文件名保存到SQL表

时间:2013-06-05 13:07:32

标签: ssis

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

  4. 使用For Each Loop容器中的执行SQL任务来调用SP。将filename作为参数传递,如:

    执行sp_MyCode param1,param2,?

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

    修改

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

    1. 选择FF连接,右键单击并选择属性

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

    3. 添加一个Expression,选择Connection String Property并定义一个带有文件绝对路径的表达式(只是为了安全起见,它也可以是UNC路径)。

答案 1 :(得分:0)

以上所有内容都可以使用脚本任务本身的C#代码完成。您可以逐个遍历所有文件并为每个文件循环: 1.批量将数据复制到分段 2.将文件名插入另一个表

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

答案 2 :(得分:0)

将一个colunm添加到您的临时表 - FileName 在SSIS变量中捕获文件名(使用表达式),然后在每个循环中运行类似的东西:

UPDATE StagingTable SET FileName=? WHERE FileName IS NULL

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