根据日期创建/附加平面文件目标。

时间:2013-10-15 18:12:00

标签: ssis

背景故事:

我有一个将医生人口统计数据加载到我们系统中的流程。此数据可以在更新之间的任何时间和任何间隔进入。数据就是我们所说的"逐个排除",意味着源文件优先,并且数据库中不在源文件中的任何医生记录都标记为" Termed&# 34;或无效。

问题:

我需要能够将来自源数据的数据输出到平面文件目的地,作为每日报告给配套的COBOL系统。在处理之前将源数据加载到ETL.PhysicianLoad表中,并且在每次新的处理事务之前擦除ETL表,因此保留一整天的时间。没有输出文件的记录现在不可能。

示例:ProcessOutput_10152013.txt

理想情况下,输出文件应该是整个日子的全面内容。处理。意思是我想要不断追加那些日子。文件直到那天结束,然后通过电子邮件发送通知,说明该文件已准备好提取。然后,应该将在一天之后进入的任何数据放入新创建的文件中。

输出应该如下(没有标题)

BatchID | LastName | FirstName | MiddleInitial | Date
0001    | Smith    | John      | A             | 10/15/13
0001    | Smith    | Sue       | R             | 10/15/13
0001    | Zeller   | Frank     | L             | 10/15/13
0002    | Peters   | Paula     | D             | 10/15/13
0002    | Rivers   | Patrick   | E             | 10/15/13
0002    | Waters   | Oliver    | G             | 10/15/13

我在想什么:

我正在考虑使用一个CurrentDate变量来保存当前日期,将它与一个名为FileName的基于表达式的变量进行比较,该变量将当前的mmddyyyy连接到" ProcessOutput_.txt"。我的想法是我应该能够在目标文件夹中找到具有该名称的文件,如果它存在,我应该能够写入它。否则我将不得不创建一个新文件。然后,我可以通过表达式将我的平面文件目标设置为FileName变量。

任何人都可以看到更好的方法,或者我可能没有看到此解决方案可能出现的任何问题吗?

1 个答案:

答案 0 :(得分:2)

我的思维过程是在正确的地方,但有缺陷。

以下是我解决问题的方法。

在尝试使用原始问题中的逻辑构建我的控制/数据流之后,我发现自己正在努力工作。

这让我再次思考,我怎样才能以最简单的方式做到这一点

首先,我是否定义了正确的变量?号。

  • CurrentDate - 必须在那里定义文件名的日期部分。
  • FileName - 必须出于显而易见的原因。

那我错过了什么?

  • FileExists (Type:boolean) - 识别文件存在的东西。
  • PlaceholderFile (类型:字符串) - 通用文件名变量

现在该怎么办?

  • 将VB脚本任务添加到控制流,设置FileExists标志。

    'Check to see if ProspectivePhysician_<currentdate>.txt exists.
    Dts.Variables("User::FileExists").Value = File.Exists(Dts.Variables("User::FileName").Value.ToString)
    
  • 现在我们已经定义了目标文件,从源表创建数据流对象。检查条件拆分中的FileExists变量。将数据流分成两个分支。创建两个名为“现有”和“新建”的平面文件目的地,暂时将它们设置到同一个平面文件位置。

如果您此时尝试运行程序包,您将收到来自两个目标之一的验证错误,因为第一个目标是拥有该文件的所有权,并且不允许第二个目标验证该文件。

如何解决此问题...使用表达式来回交换实际的FileName值。

  • 对于现有平面文件连接字符串值,请使用以下表达式:

    @ [User :: FileExists] ==是吗? @ [User :: FileName]:@ [User :: PlaceholderFile]

  • 对于New Flat File Connection String值,请使用以下表达式:

    @ [User :: FileExists] ==是吗? @ [User :: PlaceholderFile]:@ [User :: FileName]

  • 最后,右键单击数据流中的每个平面文件目标对象,并在新平面文件目标上将Overwrite属性设置为True,在现有目标上设置为False。这将确保在现有文件上使用Append操作。