0

我正在开发并于2012年SQL测试的SSIS包从文本文件导入行到一个临时表(即每次执行之前截断)使用脚本任务。然后使用Execute SQL任务运行存储过程,然后该存储过程查询登台表并格式化数据以插入到最终表中。存储过程失败在执行SQL任务,但手动成功

目前我只用两个不同的文件测试。这些文件是每天收到的独立电子邮件,我在Outlook中配置为另存为文本文件。每个文件都重命名为YYYYDDMM_HHMMSS_ [文件名] .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." 

好吧,所以这似乎很简单/足够明显...除了我的存储过程中的查询将字符串转换为日期时间,所以它应该也会在手动运行时返回一个错误,是否正确?我已经用每个文件测试过了,结果是一样的 - proc可以用任何一个文件手动运行,但执行SQL任务失败。

此外:我试着在Execute SQL任务中设置Delay Validation = True,使用OLEDB或ADO.NET连接到我的最终表,并使用Execute SQL任务中的表达式构建我的查询。这些尝试都没有对我收到的错误消息产生任何影响。

我可以尝试其他建议吗?

+0

你试过看探查器跟踪,以验证您的SSIS包发送你认为它是参数值? –

+0

是@TabAlleman,参数中的文件名是我期待的。我只是发现了一些东西 - 为了测试,我在存储过程中对文件名进行了硬编码,然后从Execute SQL命令中删除了参数。它工作正常。现在我想知道,即使我的参数是Varchar,如果我可能需要将它封装在proc中的单引号内?我需要做更多的测试...... –

回答

0

花了一下午的测试后,我终于想通了什么问题是......因为我的For Each循环进行检索,我最终被传递给该存储过程的文件名,它所含的完整的UNC路径/名文件 - 我知道。但是,当在SSIS中查看变量值时,它显示了我脚本任务中使用的格式的路径名 - \\ [server \ [folder \ [subfolder] \ [filename] - 所以我错误地在我的REPLACE命令中使用了精确的语法存储的proc在将它传递给我的插入查询之前更新@AckFileName变量。一旦我找出我的错误并纠正错误,该软件包运行良好!

相关问题