我正在开发和测试SQL 2012中的SSIS包,以使用脚本任务将行从文本文件导入到临时表(在每次执行之前被截断)。然后,执行SQL任务用于运行存储过程,然后存储过程查询登台表并格式化数据以插入到最终表中。
目前我只测试两个不同的文件。这些文件是每天收到的单独电子邮件,我已在Outlook中将其配置为另存为文本文件。每个文件都重命名为YYYYDDMM_HHMMSS_ [filename] .txt。我的SSIS包使用For Each循环将此文件名分配给变量@AckFileName,我将其传递给我的存储过程并从中解析文件datetime。
所以我的存储过程的第一行是:
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."
好的,所以这看起来很简单/显而易见......除了我的存储过程中的查询将字符串转换为datetime,所以它也应该在手动运行时返回错误,对吗?我已经对每个文件进行了测试,结果是相同的 - 使用任一文件手动运行proc,但执行SQL任务失败。
此外:我尝试在执行SQL任务中设置Delay Validation = True,使用OLEDB或ADO.NET连接到我的最终表,并使用Execute SQL任务中的表达式来构建我的查询。这些尝试都没有对我收到的错误消息产生任何影响。
我可以尝试其他任何建议吗?
答案 0 :(得分:0)
在花了整个下午的测试之后,我终于弄明白了问题是什么...因为我的For Each循环正在检索我最终传递给这个存储过程的文件名,它包含文件的完整UNC路径/名称 - 我知道。但是,在SSIS中查看变量值时,它显示了我的脚本任务中使用的格式的路径名 - \\ [server \ [folder \ [subfolder] \ [filename] - 所以我错误地在我的REPLACE命令中使用了那个确切的语法存储的proc在将其传递给我的插入查询之前更新@AckFileName变量。一旦我弄清楚我的错误并纠正了它,包运行正常!