我有一个SSIS包,我导出数据并创建四个TXT文件与导出的数据。文件名是动态生成的,以包含当前日期和时间,所以它看起来像"Export1_140723_1230.txt",我们有文件名、文件号和时间戳HHmm。
然后我使用电子邮件任务将文件通过电子邮件发送。该软件包需要一些时间来导出数据,这就是问题所在。当它试图将创建的文件包含到附件中时,出现错误:
[发送邮件任务]错误:文件"Export1_140723_1230.txt"不存在,或者您没有访问该文件的权限。
文件已创建,但名称为"Export1_140723_1231.txt",因为该过程花费了一些时间和分钟。
- 文件名是连接"Export"和使用表达式的当前日期。我已经设置了EvaluateAsExpression = TRUE。然后将文件名传递给平面文件连接,也使用表达式并使用DelayValidation = TRUE
" Export1_ " +子串((DT_WSTR 30) @用户:日期,9日,2)+ SUBSTRING((DT_WSTR, 30) @[User::Date], 4,2)+ SUBSTRING((DT_WSTR, 30) @[User::Date], 1,2)+"_"+子串((DT_WSTR 30) @用户:日期,12日,2)+ SUBSTRING((DT_WSTR, 30) @[User::Date], 15,2) +".txt"
- @[User::Date]只是GETDATE()表达式,我也在包的另一部分使用。
- 最后,邮件任务有另一个表达式FileAttachments DelayValidation = TRUE来填充文件名。
这里有一个可能的方法来处理这个问题:
-
创建一个不作为表达式求值的新变量。
-
在email任务之前添加一个脚本任务
-
将原始expr变量添加到脚本任务配置中的'ReadOnlyVariables'
-
将新的非expr变量添加到脚本任务配置中的' readwritvariables '
-
在脚本的主方法中,将原expr变量的值赋给新变量,如下所示:
Dts.Variables("用户::NewVar")。Value = Dts.Variables["User::OrigVar"].Value.ToString();
-
最后,在电子邮件步骤中,为文件名调用新变量(NewVar),该变量应该包含原始表达式的值。