2013-06-05 67 views
0

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

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

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

回答

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

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

  3. 用于每个循环容器循环访问记录集。将您的代码放入容器中。代码将从循环中接收文件名作为变量的值并处理文件。

  4. 使用在For Each Loop容器中执行SQL任务以调用SP。通过文件名作为参数,如:

    Exec sp_MyCode param1,param2,?

哪里?将通过文件名输入作为一个字符串

编辑

为了使平面文件连接拿起一个变量指定的文件 - 使用平面文件连接的连接字符串属性

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

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

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

+0

好的,我已经完成了派生列。我可以获取文件名,将其保存到列中等。我只是在使用现在用于数据流任务的平面文件部分的文件连接管理器。有什么方法可以使用变量告诉它在完成当前的文件后转到下一个文件?即它似乎很难编码,目前只处理一张桌子,我不知道如何解决这个问题。 –

+0

处理一个文件,我的意思是说,对不起! –

+0

没关系!它正在工作。非常感谢你的帮助! –

0

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

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

0

添加colunm到您的临时表 - 文件名 捕获的文件名中(使用表达式),然后运行像这样每个回路一个SSIS变量:

UPDATE StagingTable SET FileName=? WHERE FileName IS NULL 

你为什么用C#搞乱?从你的描述来看,这完全没有必要。

相关问题