Отладка задачи скрипта служб SSIS при проверке сравнения значений

У меня есть этот код в задаче сценария:

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 со значением системного месяца, это выдает мне ошибку сценария 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

Файл montNameFromSQL заполняется набором результатов предыдущей задачи SQL, а затем в этом сценарии я использую его для проверки имени системного месяца. Я хочу проверить эти значения, и если совпадение, то успех и перейти к проверке возвращаемых строк, и заполнить сообщение для отправки в моей задаче электронной почты.

Надеюсь, это что-то простое и свежая пара глаз может заметить!

Спасибо

Эндрю

2 ответа

Либо у вас назначены неправильные типы данных (именно об этом говорится в сообщении об ошибке), либо вы неверно воспроизвели свой код.

Я создал пакет с 3 переменными.

  • EmailMessage: String -
  • MonthNameFromSQL: строка - июль
  • RowCount: Int32 - 0

Контроль потока

Я настроил свою задачу "SCR Works отлично", чтобы разрешить доступ на чтение ко вторым двум переменным и доступ на чтение / запись к EmailMessage.

VB неприглядный

Внутри скрипта я использовал твой код. Я запустил его с вашим оригиналом, который работает и тот, который не работает для вас.

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, она заполнена и сценарий завершен.

введите описание изображения здесь

Этот пакет использует SQL Server 2012, но основные принципы того, что вы пробуете, доступны с 2005 года.

Единственная проблема, которую я вижу, связана с типом данных переменной MonthNameFromSQL, каким-то образом MonthNameFromSQL присваивается неверный тип данных или его нулевое значение.

Я рекомендую вам сделать следующее.

  1. Убедитесь, что поле date_column datetime в вашей таблице НЕ ПУСТО (NULLABLE), или выполните проверку Null в своем выражении sql, чтобы убедиться, что оно не передает нулевые значения в переменную MonthNameFromSQL.

    выберите различный ISNULL(преобразовать (varchar(12),(имя даты (месяц, дата_колонка))), '') как monthName ОТ dbo.table1

  2. Удалите переменную MonthNameFromSQL из окна variablbe (показанного на левой панели в Visual Studio), заново создайте эту переменную, убедившись, что область действия переменной находится на уровне пакета, а тип данных - строковый тип. выберите эту переменную из результирующего набора свойств задачи execute sql.

  3. Если вышеуказанный шаг не удался, заново создайте пакет.

Другие вопросы по тегам