【问题标题】:SSIS Assigning value to Variable using Script TaskSSIS使用脚本任务为变量赋值
【发布时间】:2013-09-13 23:21:43
【问题描述】:

我正在尝试从 SSIS 包中的平面文件中为变量赋值。我正在使用的脚本如下

#Region "Imports"
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
#End Region

' This is the class to which to add your code.  Do not change the name, attributes, or parent
' of this class.
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute()> _
<CLSCompliant(False)> _
Public Class ScriptMain
    Inherits UserComponent

    Dim StartDate As String
    Dim FinishDate As String

    Public Overrides Sub PreExecute()
        MyBase.PreExecute()

    End Sub

    Public Overrides Sub PostExecute()
        MyBase.PostExecute()
        Me.ReadWriteVariables("StartDate").Value = StartDate
        Me.ReadWriteVariables("FinishDate").Value = FinishDate

    End Sub

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        StartDate = Row.StartDate
        FinishDate = Row.FinishDate

    End Sub

End Class

我遇到的问题是,有时平面文件中的字段可能为空白,当它们为空白时我收到错误:

分配给变量“User::StartDate”的值类型与当前变量类型不同。变量在执行期间可能不会改变类型。变量类型是严格的,除了 Object 类型的变量。

有没有人知道什么可能导致错误?

【问题讨论】:

    标签: sql vba variables ssis integration


    【解决方案1】:

    我猜那是因为当您进行分配时该值将为空。 SSIS 不支持其变量的 null 值。

    当文件中没有值时,希望你的变量有什么值?当文件中没有行时,或者当有 行但 StartDate 和 EndDate 的列为空时,是否会出现问题?

    如果您想要一个空字符串,请尝试更改:

    Dim StartDate As String
    Dim FinishDate As String
    

    Dim StartDate As String = ""
    Dim FinishDate As String = ""
    

    ...防止出现没有行的情况。在这种情况下,您的 ProcessInputRow 将永远不会运行,因此您需要从一开始就将字符串设置为空。

    对于有行的情况,要注意不要在ProcessInputRow中将值设置为null:

    If Not Row.StartDate_IsNull Then
        StartDate = Row.StartDate
    End If
    
    If Not Row.EndDate_IsNull Then
        EndDate = Row.EndDate
    End If
    

    虽然如果您没有在您正在使用的文件的源上勾选“将源中的空值保留为数据流中的空值”,那么它们无论如何都应该作为空字符串传递......

    【讨论】:

    • 会有一个数据行,但 StartDate EndDate 列将是空白的,所以我认为解决方案一将是最好的方法。我根本不知道任何VB,但我猜这会给变量一个默认值“”然后如果有一行这个空白值将被实际日期覆盖
    【解决方案2】:

    如果空的开始日期和结束日期是有效的方案,您可以使用 'ColumnName'_IsNull 属性来防止出现空字段。在您的代码中,您可以添加如下内容:

    if (String.IsNullOrEmpty(Row.StartDate))
    {       
    Row.StartDate_IsNull = true;
    }        
    else        
    {            
    StartDate = Row.StartDate;           
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多