6

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

我正在使用 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' 
4

2 回答 2

1

试图找出问题所在

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

根据 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”。

基于微软文档

当 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 执行它(也尝试在存储过程的末尾添加一个虚拟选择命令)

      Exec sp_Delete ?
    
于 2019-03-06T17:34:16.220 回答
1

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

我希望这对你有用。

于 2020-02-12T07:03:51.970 回答