Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 基于源CSV文件名的条件数据流_Sql Server 2005_Ssis - Fatal编程技术网

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

Sql server 2005 基于源CSV文件名的条件数据流,sql-server-2005,ssis,Sql Server 2005,Ssis,我有一系列由州和信息类型生成的数据。例如,对于每个状态,我都有3个文件,这些文件的文件名中有一个标识符,用于告诉我它是用于哪个信息组的。这些文件中的数据由数据行组成,数据行的长度因文件类型而异。类型1总是有245个逗号分隔的值,类型2有215个,类型3有300个 我设置了3个单独的SSIS 2005包来导入此数据,但我想知道是否有一种方法可以在一个包中使用条件拆分或脚本任务来完成此操作。 我已经尝试过条件拆分,但在我看来,它希望必须检查行值。然后我查看了使用脚本任务的代码。我无法编译此代码,因为

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

我设置了3个单独的SSIS 2005包来导入此数据,但我想知道是否有一种方法可以在一个包中使用条件拆分或脚本任务来完成此操作。 我已经尝试过条件拆分,但在我看来,它希望必须检查行值。然后我查看了使用脚本任务的代码。我无法编译此代码,因为它抱怨“未定义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,那么它将转到与类型2/类型3不同的分支,以此类推

由于这段代码没有编译,我无法检查他的示例的其余部分是否有效。我也不确定他在使用什么样的脚本任务,因为我看到了3个选项,但都涉及到对作为脚本任务输入的数据行或行元素的某种操作。我要做的是将
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_文件1-3使用唯一的SourceConnectionFlat文件读取/映射列到OLEDB_Dest表

编辑:

在控制流中的脚本任务中,您可以检查文件名(在此处的变量中)并设置名为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
然后使用先决约束(双击约束行)检查脚本任务是否成功,以及类型变量的值,如下所示

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


您可以将其放入一个For Each task中,以便在文件夹中循环并设置FilePath变量。

好的,这是一个主题的变体,可以执行。问题是“DTS.Variable”代码不能“工作”。设计脚本窗口声明:Name“DTS”not declared。由于编译失败,我无法绘制约束线。此外,由于未指定输入或输出列,因此它不允许我“绘制线”“。实际上,看起来您在脚本组件中这样做是作为数据流的一部分,而不是作为控制流中的脚本任务…对吗?上面的代码需要在脚本任务中。是的,脚本任务是数据流的一部分。代码在脚本任务中。让我将脚本任务移动到数据流,看看会发生什么。就是这样。脚本任务位于错误的位置。我做了一个快速的测试,结果和预期的一样。非常感谢!实际上,不知何故,我忽略了这一点-但仍然失败,但出现了一个新错误:ACS_ALL_Import处的错误:0xC001F009:分配给变量“User::type”的值的类型与当前变量类型不同。变量在执行期间不能更改类型。变量类型是严格的,对象类型的变量除外。错误:Foreach循环容器处的0xC001C012:无法应用Foreach变量映射号2到变量“User::Type”。我已经将User::Type变量设置为Int32。我甚至尝试过布尔值、字符串等(每次更改指定的值),但没有更改。