2013-08-27 69 views
1

我有一個SSIS包運行幾個SQL存儲過程,文件任務和一個XML和腳本任務。最終的腳本任務發送一個包含html表格的電子郵件,附加的excel文件和一個電子郵件正文。我有一個變量,用於每天唯一地標記excel文件,以及唯一標記電子郵件的主題行。這個變量只是當前的日期。但是,日期最初是在變量的值中「硬編碼」的,但我決定添加一個執行SQL任務,該任務返回並格式化當前日期,然後填充該日常變量。我遇到的問題是,當變量的值字段爲空時,發送電子郵件的腳本任務失敗。即使它不是空的,腳本任務也會失敗。只有當輸入當前日期值時它纔會成功 - 所以它只在該值等於填充變量的SQL Task的返回值時才起作用。但是,腳本任務抓取SQL Task的返回值,而不是變量的「硬編碼」值。我知道這一點,因爲我可以在變量的值部分編寫「2013年8月,2013年」(無上限),並且電子郵件和文件擴展名中使用的值仍然爲2013年8月23日(大寫) - 準確的返回值SQL任務。我的問題是,在我的研究中,我沒有找到很多有用的信息,是「爲什麼會發生這種情況?」不得不每天寫入這個值都會使得SQL Task [填充變量]在那裏開始。此外,請注意,當我最初添加SQL任務時,即使使用空變量值,程序包也會成功。直到我對這個軟件包做了幾個補充之後,我才遇到了這個困境。任何意見,建議和意見將不勝感激。非常感謝你。SSIS字符串變量失敗腳本任務

發生故障的腳本任務的代碼如下: 每日可變我說的被命名爲「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; 
    } 
+1

請發佈失敗腳本任務的代碼。 –

+0

所以我找到了解決辦法,但我仍然對問題是什麼感到困惑。如果我將填充「InternalStr_FieldingDate」變量的SQL任務移動到任務鏈上,程序包會成功執行,而不會制動腳本任務,但是如果我將它放在原始位置(第三個起始位置 - SQL Task,XML Task,Script任務),它會中斷腳本任務。有人知道這個原因嗎?非常感謝你提前。 – user2414367

回答

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

+0

謝謝,斯蒂芬。我最初嘗試過,因爲某種原因變量沒有評估表達式。我可能忘記將EvaluateAsExpression屬性設置爲true。 – user2414367

+0

我想知道它是否可能是一個可變範圍問題 - 即根據您定義變量的位置移動任務。我懷疑它是 - 回到你的代碼,但我可能會定義局部變量並將它們設置爲包變量 - 然後在你的電子郵件生成聲明中使用它們 - 而不是在線調用replace等。更易於閱讀和更好的調試 – Stephen