基于源CSV文件名的条件数据流

时间:2011-02-24 17:33:13

标签: sql-server-2005 ssis

我有一系列由州和信息类型生成的数据。例如,对于每个状态,我有3个文件名中有标识符的文件,告诉我它是哪个信息组。这些文件中的数据由具有不同长度的数据行组成,具体取决于文件类型。类型1始终具有245个逗号分隔值,类型2具有215,类型3具有300。

我设置了3个单独的SSIS 2005软件包来导入这些数据,但我想知道是否有办法在一个包含条件拆分或脚本任务的软件包中执行此操作。 我已经尝试了条件性拆分,但它看起来像是期望必须检查行值。然后我查看了使用脚本任务的代码here。我无法编译这段代码,因为它抱怨“DTS没有被定义”。这可能是作者认为我对某些人有所了解的情况之一,对他来说,基本的SSIS想法 - 而且我没有那些知识。 我修改了那里的代码:

Imports System
Imports System.Data
Imports System.Math
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime

Public Class ScriptMain
    ' Created: Zack Bethem – AmberLeaf
    Public Sub Main()
        Dim fileLoc, fileName As String
        If Dts.Variables.Contains("User::fileName") = True Then
            fileName = CStr(Dts.Variables.Item("User::fileName").Value)
            If fileName.Contains("0074000") Then
                Dts.Variables.Item("User::SexByInd").Value = True
            ElseIf fileName.Contains("0072000") Then
                Dts.Variables.Item("User::SexByOcc").Value = True
            ElseIf fileName.Contains("0022000") Then
                Dts.Variables.Item("User::Migration").Value = True
            End If
            Dts.TaskResult = Dts.Results.Success
        Else
            Dts.TaskResult = Dts.Results.Failure
        End If
    End Sub
End Class

从代码中可以看出: 我正在使用For Each循环遍历目录中的文件。 我将每个文件的文件名分配给User::fileName,然后检查文件名是否包含3个字符串元素之一。 如果它包含类型1,那么它将转到与Type2 / Type3等不同的分支。

由于此代码无法编译,因此我无法检查其示例的其余部分是否有效。我不确定他正在使用什么样的脚本任务,因为我遇到了3个选项,但都涉及对作为Scripting Task的输入的行或行元素的某种操作。我想要做的是传递User::fileName作为输入,然后测试其他3个User::变量的布尔值,以形成3个分支。

我目前的想法是这样的: 在单个For Each循环中,有一个数据流任务:

           Scripting Task
      /         |           \
   (Type1)   (Type2)       (Type3)
    |            |            |
 CSV_Files1  CSV_Files2    CSV_Files3
    |            |            |
OLEDB_Dest1  OLEDB_Dest2   OLEDB_Dest3

CSV_Files1-3使用唯一的SourceConnectionFlat文件将列读取/映射到OLEDB_Dest表。

编辑: Design Script Error

1 个答案:

答案 0 :(得分:2)

在控制流程中的脚本任务中,您可以检查文件名(在此处的变量中)并设置名为Type ...的变量。

    If Dts.Variables("User::FilePath").Value.ToString.Contains("cl") Then
        Dts.Variables("User::Type").Value = 1
    Else
        Dts.Variables("User::Type").Value = 2
    End If

    Dts.TaskResult = Dts.Results.Success

然后使用先前约束(双击约束线)来检查脚本任务的成功,以及Type变量的值,如下所示。

enter image description here

流程看起来与此类似,每个约束检查Type ...的不同值

enter image description here

您可以将其放入For Each任务中以遍历您的文件夹并设置FilePath变量。