从SSIS调用Delete语句失败

Nei*_*l P 5 sql odbc ssis snowflake-cloud-data-platform ssis-2016

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

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

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

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

在此处输入图片说明

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

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

编辑:

添加我的删除语句:

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

Had*_*adi 2

试图找出问题所在

在搜索此问题时,我在Devart 支持页面上发现了一些有趣的内容,其中报告了类似的问题:

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

基于微软文档

当 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' 
Run Code Online (Sandbox Code Playgroud)

值得尝试的东西

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

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

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

      Exec sp_Delete ?
    
    Run Code Online (Sandbox Code Playgroud)