【问题标题】:SSIS Error: Could not complete cursor operationSSIS 错误:无法完成游标操作
【发布时间】:2015-03-31 14:55:32
【问题描述】:

我有一个每天早上运行的 SQL Server 作业。它存在于我无法访问的环境中。

此作业运行多个 SSIS 包。它运行的第一个包相当简单。它有 5 个基本步骤:

  1. 执行 SQL。创建将平面文件源插入其中的临时表。
  2. 数据流任务。将数据从平面文件源移动到 OLEDB 目标(临时表)。我有一个数据转换任务,它只是将每一列设置为nvarchar(255)。这很好用。
  3. 序列容器(内部有 3 个执行 SQL 任务)。此容器包含三个执行 SQL 任务,所有这些任务都对暂存表进行数据更新(更新 NULLS、无效文本等)。

我不在 SSIS 包本身中使用游标。我在下面列出了错误:

一个 OLE DB 记录可用。来源:“Microsoft OLE DB Provider for SQL Server”Hresult:0x80004005 描述:“无法完成游标操作,因为声明游标后表架构发生了变化。”。结束错误

此错误还涉及两个组件:

OLE DB 目标 [25] 描述:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “输入“OLE DB 目标输入”(38)”失败,因为发生错误代码 0xC020907B,并且“输入“OLE DB 目标输入”(38)”上的错误行处理指定错误失败。

我没有在这个 SSIS 包中构建或使用游标。我所做的唯一数据库更改是构建临时表。

与我一起解决此问题的联系人说这可能是由 NULL 值引起的,但是,我的所有列都是 NULLable。

【问题讨论】:

  • 游标必须包含在包执行期间直接或间接调用的代码中。在没有看到该代码的情况下,SO 上的任何人都无法帮助调试它。
  • 我害怕那个。但是,我认为此时排除包装本身就足够了。我目前是这个项目的唯一成员,所以我很高兴能够至少从 SO 中反弹一些东西。如果我们需要关闭它,我们可以。

标签: sql-server sql-server-2008 ssis


【解决方案1】:

显然,SSIS 在内部使用游标来处理您需要的一些任务——MS 开发人员使用游标很常见。您可以尝试通过运行项目并禁用任务并运行它或通过非常仔细地阅读进度选项卡来找出出错的任务。

我会尝试,对于 Execute SQL Tasks,将 Bypass Prepare 设置为 true 并再次尝试这些任务。

【讨论】:

  • 感谢您的评论。我实际上使用了组件 ID,并将其追溯到 SSIS 原生的 OLE DB 输入组件。所以这个包在临时表构建后立即失败。
  • 原始列表中哪一步失败了?
  • 原始列表的第二步。表创建成功,将平面文件拉入并发送到我的数据流任务的数据转换任务,一旦碰到OLE DB Input组件就失败了。
  • 在您的原始列表中,您说它工作正常。当您说将每一列设置为 nvarchar(255) 时,您的意思是将数据复制到一个表中,该表的每一列都定义为 nvarchar(255),或者您将表/列定义更改为 nvarchar(255)?
  • 抱歉让您感到困惑。数据流任务本身具有三个任务,平面文件源、数据转换、OLE DB 源。 OLE DB 源在输入组件处失败。数据转换没问题。
【解决方案2】:

事实证明,环境已以需要重建数据库索引的方式进行修补。因此,执行包时架构与存储的元数据不同。

我确信导致此错误的原因不止一个,但这就是我们所发生的。

感谢所有评论的人。

【讨论】:

    【解决方案3】:

    在运行使用 SCD 组件作为维度表的包时,我们收到了相同的错误消息。遵循重建索引的建议对我们有用。但是我们执行了两个动作。确切地说,我们做了以下工作:

    1. 删除并重新创建索引
    2. 重新创建了维度包的 SCD 组件(只需将一个非业务键属性的类型更改为业务键属性,完成向导,反之亦然)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-05-07
      • 2015-06-03
      • 2021-03-24
      • 2020-07-29
      • 2021-12-16
      • 2015-12-27
      相关资源
      最近更新 更多