从SSIS调用DELETE语句失败 [英] Delete statement fails when called from SSIS

查看:29
本文介绍了从SSIS调用DELETE语句失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我使用的是ODBC连接和执行SQL任务。TRUNCATE TABLE语句工作正常,任务成功完成。将此更改为删除,任务将失败,并显示以下错误:

失败,错误如下:"调用COM组件返回错误HRESULT E_FAIL。"可能的失败原因:查询问题、"ResultSet"属性设置不正确、参数设置不正确或连接建立不正确。

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

我怀疑当SSIS将"Results"设置为"None"时,它看起来就像是一个结果集。我已将其更改为单行,并将"完整结果集"更改为对象,但无论设置如何,仍会出现错误。

要使SSIS成功针对Snowflake执行语句,我需要更改哪些内容?

编辑:

添加我的DELETE语句:

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

推荐答案

正在尝试解决问题

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

根据Microsoft文档,如果查询没有影响,任何记录都将返回结果SQL_NO_DATA(对于ODBC 3.x规范)。我们的驱动程序和SSIS使用ODBC 3.x规范,然而,在所描述的情况下,SSIS将行为实现为ODBC 2.x。这就是为什么当收到SQL_NO_DATA的结果时,调用COM组件会返回错误&QOOT;ERROR HRESULT E_FAIL。

基于Microsoft documentation

当ODBC 3.x应用程序调用ODBC 2.x驱动程序中的SQLExecDirect、SQLExecute或SQLParamData来执行搜索到的UPDATE或DELETE语句(该语句不会影响数据源中的任何行)时,驱动程序应返回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命令后添加虚拟SELECT行

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

      Exec sp_Delete ?
    

这篇关于从SSIS调用DELETE语句失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆