检查值比较时SSIS脚本任务调试

时间:2013-08-13 10:42:54

标签: variables ssis runtime-error dts

我在脚本任务中有这段代码:

Public Sub Main()
    '
    ' Add your code here
    '
    Dim MonthFromSQL As String
    Dim lastMonth As New Date(DateTime.Today.Year, DateTime.Today.Month - 1, 1)
    Dim rcnt As Integer
    Dim msg As String
    'MsgBox("Month name from SQL is " & CStr(Dts.Variables("MonthNameFromSQL").Value))
    rcnt = CInt(Dts.Variables("RowCount").Value)
    If rcnt = 0 Then
            msg = "Job returned 0 rows for month " & CStr(MonthName(lastMonth.Month, False)) & " - check with database operator that previous month's data has been loaded into the database."
     Else
            msg = "Job returned " & rcnt & " rows - Job Finished"
     End If
    'Pass message variable value out to be used in message 
    Dts.Variables("EmailMessage").Value = msg
    Dts.TaskResult = Dts.Results.Success
End Sub

如果我将IF语句修改为以下,以便能够根据系统月份值检查SQL DB中的月份值,则会给出一个DTS脚本错误,说明:

  

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

'First check month name from sql match system last month name
    If CStr(MonthName(lastMonth.Month, False)) = CStr(Dts.Variables("MonthNameFromSQL").Value) Then
        MsgBox("Month name variable equals last month value")
        If rcnt = 0 Then
            msg = "Job returned 0 rows for month " & CStr(MonthName(lastMonth.Month, False)) & " - check with outpatient database operator that previous month's data has been loaded into the database."
        Else
            msg = "Job returned " & rcnt & " rows - Job Finished"
        End If
    Else
    'Put in code to handle if month values do not match
    End If

我换了:

If CStr(MonthName(lastMonth.Month, False)) = CStr(Dts.Variables("MonthNameFromSQL").Value) Then
        MsgBox("Month name variable equals last month value")

使用:

If 1=1 Then
MsgBox("Month name variable equals last month value")

只是检查它是否可以使用简单的比较语句,并且它与我在IF语句中的代码有关,因为我没有怀疑它与我填充的msg变量有关,甚至虽然这是错误信息。

所以我意识到这与它有关:

If CStr(MonthName(lastMonth.Month, False)) = CStr(Dts.Variables("MonthNameFromSQL").Value) Then

使用先前SQL任务的结果集填充montNameFromSQL,然后在此脚本中我使用它来检查系统月份名称。我想检查这些值,如果匹配则成功并继续检查返回的行,并填充消息以发送到我的电子邮件任务。

希望这很简单,一双新眼睛可以发现!

由于

安德鲁

2 个答案:

答案 0 :(得分:0)

您指定了错误的数据类型(错误消息说明的内容),或者您没有忠实地复制代码。

我创建了一个包含3个变量的包。

  • EmailMessage:String -
  • MonthNameFromSQL:String - July
  • RowCount:Int32 - 0

Control flow

我将“SCR Works正常”任务配置为允许对第二个两个变量的读访问权以及对EmailMessage的读/写访问权。

VB is icky

在脚本中,我使用了你的代码。我用你的原作和适合你的原作来运行它。

Public Sub Main()
    Dim MonthFromSQL As String
    Dim lastMonth As New Date(DateTime.Today.Year, DateTime.Today.Month - 1, 1)
    Dim rcnt As Integer
    Dim msg As String

    'MsgBox("Month name from SQL is " & CStr(Dts.Variables("MonthNameFromSQL").Value))
    rcnt = CInt(Dts.Variables("RowCount").Value)
    'If rcnt = 0 Then
    '    msg = "Job returned 0 rows for month " & CStr(MonthName(lastMonth.Month, False)) & " - check with database operator that previous month's data has been loaded into the database."
    'Else
    '    msg = "Job returned " & rcnt & " rows - Job Finished"
    'End If

    'First check month name from sql match system last month name
    If CStr(MonthName(lastMonth.Month, False)) = CStr(Dts.Variables("MonthNameFromSQL").Value) Then
        MsgBox("Month name variable equals last month value")
        If rcnt = 0 Then
            msg = "Job returned 0 rows for month " & CStr(MonthName(lastMonth.Month, False)) & " - check with outpatient database operator that previous month's data has been loaded into the database."
        Else
            msg = "Job returned " & rcnt & " rows - Job Finished"
        End If
    Else
        'Put in code to handle if month values do not match
        msg = "I am here"
    End If

    'Pass message variable value out to be used in message 
    Dts.Variables("EmailMessage").Value = msg

    Dts.TaskResult = ScriptResults.Success
End Sub

从EmailMessage变量的值可以看出,它已经填充并且脚本已经完成。

enter image description here

此软件包使用的是SQL Server 2012,但您所尝试的基础知识自2005年开始提供。

答案 1 :(得分:0)

唯一的问题我看到的是MonthNameFromSQL变量的数据类型,不知何故,MonthNameFromSQL分配了错误的数据类型或其获取空值。

我会建议您执行以下操作。

  1. 确保表中的date_column datetime字段为NOT NULLABLE或者在sql语句中执行null检查以确保它没有将任何空值传递给MonthNameFromSQL变量。

    选择不同的ISNULL(转换(varchar(12),(datename(month,date_column))),'')作为monthName FROM dbo.table1

  2. 从variablbe窗口中删除MonthNameFromSQL变量(如图所示)     在visual studio中的左窗格中,再次重新创建此变量     确保变量的范围是包级别和数据     type是字符串类型。从执行结果集中选择此变量     sql任务属性。

  3. 如果上述步骤失败,请重新创建包。