从 SSIS 调用时删除语句失败

Posted

技术标签:

【中文标题】从 SSIS 调用时删除语句失败【英文标题】:Delete statement fails when called from SSIS 【发布时间】:2019-07-26 18:42:35 【问题描述】:

我正在尝试从 SSIS 编排 Snowflake。

我正在使用 ODBC 连接和执行 SQL 任务。 truncate table 语句工作正常,任务成功完成。将此更改为删除,任务失败并出现以下错误:

失败并出现以下错误:“错误 HRESULT E_FAIL 已从对 COM 组件的调用中返回。”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确,参数设置不正确,或者连接没有正确建立。

从雪花查询历史可以看出,查询成功完成:

我怀疑当 SSIS 设置为“无”时,“结果”看起来就像一个结果集。我已将其更改为单行和“完整结果集”到一个对象中,但无论设置如何,仍然会出错。

为了让 SSIS 成功执行针对 Snowflake 的语句,我需要进行哪些更改?

编辑:

添加我的删除语句:

delete from SUMMARY.Data_minutes
where date >= dateadd(day,-5  ,'2019-01-20' )
and date <= '2019-01-20' 

【问题讨论】:

删除是执行 SQL 任务中的原始查询是吗?你有映射的参数吗?删除是否适用于设置为“无”的结果集属性? 您使用了什么 ODBC 驱动程序?我怀疑它的实施可能是罪魁祸首,而它却期望某些东西不会出现。我建议你使用 javascript UDL 而不是 SQL DELETE @NeilP 你使用的删除命令是什么?? @Arthur 官方 Snowflake 64 位 odbc 驱动程序。 @JacobH 删除是执行 sql 任务中的原始查询。没有映射参数,当结果集设置为 none 时仍然失败。 【参考方案1】:

试图找出问题

在搜索此问题时,我在Devart support page 发现了一些有趣的东西,其中报告了类似问题:

根据 Microsoft 文档,如果查询没有影响任何记录,将返回结果 SQL_NO_DATA(对于 ODBC 3.x 规范)。我们的驱动程序和 SSIS 使用 ODBC 3.x 规范,但是,在所描述的情况下,SSIS 将行为实现为 ODBC 2.x。这就是为什么在收到 SQL_NO_DATA 的结果时,会返回错误“Error HRESULT E_FAIL has been returned from a call to a COM component”。

基于Microsoft documentation:

当 ODBC 3.x 应用程序在 ODBC 2.x 驱动程序中调用 SQLExecDirect、SQLExecute 或 SQLParamData 以执行不影响数据源中任何行的搜索更新或删除语句时,驱动程序应返回 SQL_SUCCESS,而不是SQL_NO_DATA。当使用 ODBC 3.x 驱动程序的 ODBC 2.x 或 ODBC 3.x 应用程序以相同的结果调用 SQLExecDirect、SQLExecute 或 SQLParamData 时,ODBC 3.x 驱动程序应返回 SQL_NO_DATA。

这意味着当没有行匹配以下条件时,它将抛出异常(类似情况:ODBC版本冲突)

where date >= dateadd(day,-5  ,'2019-01-20' )
and date <= '2019-01-20' 

尝试一下

我现在无法测试此解决方法,但您可以尝试两种方法:

    在删除命令后添加一个虚拟选择行

    delete from SUMMARY.Data_minutes
    where date >= dateadd(day,-5  ,'2019-01-20' )
    and date <= '2019-01-20' 
    
    select 1
    

    创建一个存储过程并将日期作为参数传递,并从执行SQL任务中执行它(也尝试在存储过程的末尾添加一个虚拟选择命令)

     Exec sp_Delete ?
    

【讨论】:

【参考方案2】:

我遇到了同样的问题,为了解决我将我的 ODBC 连接更改为 ADO.net 连接。

我希望这对你有用。

【讨论】:

以上是关于从 SSIS 调用时删除语句失败的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 在本地运行但在服务器上失败

如何从 .NET 以编程方式调用 SSIS?

从SQL Server代理作业步骤调用时,SSIS包不会运行

调用 MySQL 函数时 PHP 准备语句失败

SSIS错误汇总

作为作业运行时,SSIS 变量不包含正确的值