Отладка задачи скрипта служб 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.
Внутри скрипта я использовал твой код. Я запустил его с вашим оригиналом, который работает и тот, который не работает для вас.
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 присваивается неверный тип данных или его нулевое значение.
Я рекомендую вам сделать следующее.
Убедитесь, что поле date_column datetime в вашей таблице НЕ ПУСТО (NULLABLE), или выполните проверку Null в своем выражении sql, чтобы убедиться, что оно не передает нулевые значения в переменную MonthNameFromSQL.
выберите различный ISNULL(преобразовать (varchar(12),(имя даты (месяц, дата_колонка))), '') как monthName ОТ dbo.table1
Удалите переменную MonthNameFromSQL из окна variablbe (показанного на левой панели в Visual Studio), заново создайте эту переменную, убедившись, что область действия переменной находится на уровне пакета, а тип данных - строковый тип. выберите эту переменную из результирующего набора свойств задачи execute sql.
Если вышеуказанный шаг не удался, заново создайте пакет.