我有一个SSIS包,它运行多个SQL存储过程,文件任务以及xml和脚本任务。最终脚本任务发送带有html表,Excel文件附件和电子邮件正文的电子邮件。我有一个变量,用于每天唯一标记Excel文件,以及唯一标记电子邮件的主题行。此变量只是当前日期。但是,该日期最初是"硬编码"在变量值中。但是,我决定添加一个执行SQL任务,它返回并格式化当前日期。然后填充每日变量。
我遇到的问题是,当变量的值字段为空时,脚本任务(发送电子邮件)失败。即使它不为空,脚本任务也会失败。只有在输入当前日期值时才会成功。因此,只有当值等于填充变量的SQL任务的返回值时,它才有效。
但是,脚本任务会获取SQL任务的返回值,而不是变量"硬编码"值。我知道这是因为我可以在变量的值部分中编写23 august, 2013
(无上限),并且电子邮件和文件扩展名中使用的值仍为23 August, 2013
(大写) - - SQL任务的确切返回值。
我的问题是,我在研究中找不到很多有用的信息,是,"为什么会发生这种情况?"必须每天写入该值,这使得开始使用SQL任务[填充变量]的目的失败了。此外,请注意,当我最初添加SQL任务时,即使使用空变量值,包也会成功。直到我对包装进行了几次添加之后才发生这种困境。任何意见,建议和建议将受到高度赞赏。非常感谢你。
下面列出了失败脚本任务的代码。我所说的每日变量名为InternalStr_FieldingDate
public void Main()
{
String EmailMsgBody = String.Format("<HTML><BODY><P>{0}</P><P>{1}</P></BODY></HTML>"
, Dts.Variables["Config_SMTP_MessageSourceText"].Value.ToString()
, Dts.Variables["InternalStr_CountResultAfterXSLT"].Value.ToString());
MailMessage EmailCountMsg = new MailMessage(Dts.Variables["Config_SMTP_From"].Value.ToString().Replace(";", ",")
, Dts.Variables["Config_SMTP_Success_To"].Value.ToString().Replace(";", ",")
, Dts.Variables["Config_SMTP_SubjectLinePrefix"].Value.ToString() + " " + Dts.Variables["InternalStr_FieldingDate"].Value.ToString()
, EmailMsgBody);
//Add Attachment
String filename = Dts.Variables["fileDailyReport"].Value.ToString();
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(filename);
EmailCountMsg.Attachments.Add(attachment);
//EmailCountMsg.From.
EmailCountMsg.CC.Add(Dts.Variables["Config_SMTP_Success_CC"].Value.ToString().Replace(";", ","));
EmailCountMsg.IsBodyHtml = true;
SmtpClient SMTPForCount = new SmtpClient(Dts.Variables["Config_SMTP_ServerAddress"].Value.ToString());
SMTPForCount.Credentials = CredentialCache.DefaultNetworkCredentials;
SMTPForCount.Send(EmailCountMsg);
Dts.TaskResult = (int)ScriptResults.Success;
}
答案 0 :(得分:0)
如果变量只是唯一地命名文件 - 那么使用SQL任务返回变量似乎并不浪费吗?
更好的选择是从表达式计算变量。
变量具有与其他任何属性相同的属性。
您可以将EvaluateAsExpression属性设置为true,然后使用您喜欢的任何表达式来计算日期。举个例子:
(DT_WSTR, 4 )YEAR(getdate())
+ RIGHT("0" + (DT_WSTR,2)MONTH(getdate()),2)
+ RIGHT("0" + (DT_WSTR,2)DAY(getdate()),2)
将返回要使用的YYYYMMDD字符串。