2013-08-13 3 views
0

У меня есть этот код в задаче сценария:SSIS Script Task Debugging При проверке значения для сравнения

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, говорящую о том, что:

Тип значения, присвоенного переменной «Пользователь :: 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") 

Просто, чтобы проверить это будет работать с простым по сравнению заявления и что это было что-то делать с кодом I был в выражении IF, поскольку я не подозревал, что это связано с переменной msg, которую я заполнял, хотя это было сообщение об ошибке.

Так что я понимаю, что это что-то делать с:

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

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

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

Благодаря

Andrew

+0

Каков тип данных Dts.Variables ("MonthNameFromSQL"). Значение? это тип объекта? Также покажите sql-скрипт, который используется в задаче sql для заполнения переменной montNameFromSQL. –

+0

Тип данных не является строкой, а не объектом. Следующий запрос используется для получения значения monthName (псевдоним в запросе) в MonthNameFromSQL с использованием свойства набора результатов в задаче sql : выберите отдельный конвертер (varchar (12), (имя_таблицы (месяц, дата_колонка))) \t as monthName FROM dbo.table1 – Andrew

+0

После изменения утверждения на If 1 = 1 Тогда MsgBox («Переменная названия месяца равна значению последнего месяца»), была ли ошибка осталась прежней? –

ответ

0

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

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

  • EmailMessage: String -
  • MonthNameFromSQL: String - июль
  • RowCount: Int32 - 0

Control flow

Я настроил мой "SCR работает отлично" задачу, чтобы разрешить доступ для чтения ко вторым двум переменным и доступу чтения/записи к 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 года

+0

оценил, что вы пытаетесь это сделать для меня. Я буду оглядываться назад через свою настройку в какой-то момент сегодня, надеюсь, прежде чем потерять утренние «свежие глаза»! – Andrew

+0

обнаружил, что моя переменная msg пуста, даже если мой счетчик строк имеет значение и должен заполнить переменную msg сообщением в инструкции IF. Так что это падает, потому что я пытаюсь ничего не помещать в переменную пакета EmailMessage через мою переменную скрипта msg – Andrew

0

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

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

  1. Убедитесь, что date_column поле даты и времени в таблице НЕ NULLABLE или делать нулевой чек в вашем SQL заявление, чтобы убедиться, что он не проходит никаких нулевых значений переменной MonthNameFromSQL.

    выберите отчетливый ISNULL (конвертировать (VARCHAR (12), (datename (месяц, date_column))), ''), как MONTHNAME ОТ dbo.table1

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

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

+0

S.M спасибо за совет, и мы снова рассмотрим это сегодня. – Andrew

Смежные вопросы