SSIS使用脚本任务为变量赋值

时间:2013-09-10 09:51:00

标签: sql vba variables ssis integration

我正在尝试从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类型的变量。

有没有人有任何想法可能导致错误?

2 个答案:

答案 0 :(得分:2)

我猜这是因为当你进行任务时,该值将为null。 SSIS不支持其变量的空值。

当文件中没有值时,您想要您的变量有什么价值?如果文件中没有行,或者 一行但是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

虽然如果你没有在你正在使用的文件的源上勾选“将数据流中的空值保留为数据流中的空值”,但它们应该以空字符串的形式出现...

答案 1 :(得分:1)

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

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