我在脚本任务中有这段代码:
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,然后在此脚本中我使用它来检查系统月份名称。我想检查这些值,如果匹配则成功并继续检查返回的行,并填充消息以发送到我的电子邮件任务。
希望这很简单,一双新眼睛可以发现!
由于
安德鲁
答案 0 :(得分:0)
您指定了错误的数据类型(错误消息说明的内容),或者您没有忠实地复制代码。
我创建了一个包含3个变量的包。
我将“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年开始提供。
答案 1 :(得分:0)
唯一的问题我看到的是MonthNameFromSQL变量的数据类型,不知何故,MonthNameFromSQL分配了错误的数据类型或其获取空值。
我会建议您执行以下操作。
确保表中的date_column datetime字段为NOT NULLABLE或者在sql语句中执行null检查以确保它没有将任何空值传递给MonthNameFromSQL变量。
选择不同的ISNULL(转换(varchar(12),(datename(month,date_column))),'')作为monthName FROM dbo.table1
从variablbe窗口中删除MonthNameFromSQL变量(如图所示) 在visual studio中的左窗格中,再次重新创建此变量 确保变量的范围是包级别和数据 type是字符串类型。从执行结果集中选择此变量 sql任务属性。
如果上述步骤失败,请重新创建包。