1

我有一个 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;
    }
4

1 回答 1

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 字符串。

于 2013-08-27T21:10:31.427 回答