【发布时间】:2017-02-01 17:48:50
【问题描述】:
我正在开发和测试 SQL 2012 中的 SSIS 包,以使用脚本任务将文本文件中的行导入临时表(在每次执行前被截断)。然后使用 Execute SQL 任务运行存储过程,然后查询暂存表并格式化数据以插入到最终表中。
目前我只测试两个不同的文件。这些文件是每天收到的单独电子邮件,我已在 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."
好的,这看起来很简单/很明显......除了我的存储过程中的查询将字符串转换为日期时间,所以它在手动运行时也应该返回错误,对吗?我已经对每个文件进行了测试,结果是相同的 - proc 使用任一文件手动运行良好,但执行 SQL 任务失败。
另外:我尝试在 Execute SQL 任务中设置 Delay Validation = True,使用 OLEDB 或 ADO.NET 连接到我的最终表,并使用 Execute SQL 任务中的表达式来构建我的查询。这些尝试都没有对我收到的错误消息产生任何影响。
我可以尝试其他任何建议吗?
【问题讨论】:
-
您是否尝试过观察分析器跟踪来验证您的 SSIS 包是否正在发送您认为的参数值?
-
是的@TabAlleman,参数中的文件名是我所期望的。我刚刚发现了一些东西——为了测试,我在存储过程中硬编码了文件名,然后从我的 Execute SQL 命令中删除了参数。它工作正常。现在我想知道即使我的参数是 Varchar,是否可能需要将它封装在 proc 内的单引号中?我需要做更多的测试......
标签: stored-procedures ssis sql-server-2012 parameter-passing sp-executesql