从SSIS中调用Delete语句失败

时间:2019-03-05 10:15:50

标签: sql ssis odbc snowflake-datawarehouse ssis-2016

我正在尝试从SSIS编排雪花。

我正在使用ODBC连接并执行SQL任务。截断表语句工作正常,任务成功完成。将其更改为删除后,任务将失败,并显示以下错误:

  

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

从雪花查询历史记录中可以看到查询成功完成:

enter image description here

当设置为期望“无”时,我怀疑“结果”在SSIS中看起来像结果集。我将其更改为单行和“完整结果集”都变成了对象,但是无论设置如何,仍然会出错。

为了使SSIS成功执行对Snowflake的语句,我需要更改什么?

编辑:

添加我的删除语句:

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

2 个答案:

答案 0 :(得分:1)

试图找出问题所在

在搜索此问题时,我在Devart support page处发现了一些有趣的地方,报告了类似的问题:

  

根据Microsoft文档,如果查询未影响任何记录,则将返回结果SQL_NO_DATA(用于ODBC 3.x规范)。我们的驱动程序和SSIS使用ODBC 3.x规范,但是,在上述情况下,SSIS将行为实现为ODBC2.x。因此,当收到SQL_NO_DATA的结果时,将返回错误“从对COM组件的调用返回了错误HRESULT E_FAIL”。

基于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' 

可以尝试的

我目前无法测试此替代方法,但是您可以尝试两种方法:

  1. 在删除命令后添加虚拟选择行

    delete from SUMMARY.Data_minutes
    where date >= dateadd(day,-5  ,'2019-01-20' )
    and date <= '2019-01-20' 
    
    select 1
    
  2. 创建一个存储过程并传递日期作为参数,然后从Execute SQL Task 中执行它(也尝试在存储过程的末尾添加一个虚拟选择命令) < / p>

     Exec sp_Delete ?
    

答案 1 :(得分:0)

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

我希望对您有用。