我正在开发和测试SQL 2012中的SSIS包,使用脚本任务将文本文件中的行导入到staging表中(在每次执行之前被截断)。然后使用Execute SQL任务运行存储过程,该过程随后查询staging表并格式化数据以便插入最终表。
目前我只测试两个不同的文件。这些文件是每天收到的单独的电子邮件,我在Outlook中设置为保存为文本文件。每个文件重命名为YYYYDDMM_HHMMSS_[filename].txt。我的SSIS包使用For Each循环将这个文件名分配给一个变量@AckFileName,我将该变量传递到存储过程中,并从中解析文件日期时间。
所以我的存储过程的第一行是:SELECT DISTINCT CONVERT(datetime,left(@AckFileName,8)+' '+substring(@AckFileName,10,2)+':'+substring(@AckFileName,12,2)+':'+substring(@AckFileName,14,2))
当我在SSMS中运行存储过程时,它工作正常:
Exec [dbo].[ParseAckFile] @AckFileName
然而,即使我有相同的代码为我的SQL语句在我的执行SQL任务,我收到以下错误:
"Exec [dbo].[ParseAckFile]..." failed with the following error: "Conversion failed when converting date and/or time from a character string."
好,这看起来很简单/很明显…除了我的存储过程中的查询正在将字符串转换为日期时间,所以它在手动运行时也应该返回错误,对吗?我对每个文件都进行了测试,结果是一样的——无论手动使用哪个文件,过程都运行得很好,但是执行SQL任务失败了。
另外:我尝试在执行SQL任务中设置延迟验证= True,使用OLEDB或ADO。. NET连接到我的最终表,并使用Execute SQL任务中的表达式来构建查询。这些尝试对我收到的错误信息都没有任何影响。
还有什么建议可以试试吗?
经过整个下午的测试,我终于找到了问题所在…因为For Each循环正在检索我最终传递给这个存储过程的文件名,所以它包含了文件的完整UNC路径/名称——这是我知道的。然而,当在SSIS中查看变量值时,它显示了我的脚本任务中使用的格式的路径名- \[服务器[文件夹[子文件夹][文件名]-所以我错误地在存储过程中的REPLACE命令中使用了确切的语法来更新@AckFileName变量,然后将其传递给我的插入查询。一旦我发现了我的错误并改正了它,包就可以正常运行了!