【问题标题】:Stored procedure fails in Execute SQL task, but succeeds manually存储过程在执行 SQL 任务中失败,但手动成功
【发布时间】: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


【解决方案1】:

在花了整个下午的测试之后,我终于弄清楚了问题所在......因为我的 For Each 循环正在检索我最终传递给这个存储过程的文件名,它包含文件的完整 UNC 路径/名称- 我知道。但是,在 SSIS 中查看变量值时,它以我的脚本任务中使用的格式显示路径名 - \\[server\[folder\[subfolder]\[filename] - 所以我错误地在我的 REPLACE 命令中使用了该确切语法存储过程在将@AckFileName 变量传递给我的插入查询之前对其进行更新。一旦我发现我的错误并纠正它,包就可以正常运行了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2023-04-04
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多