无法确定元数据,因为语句 <SELECT Statement 1> 与语句不兼容 <SELECT Statement 2>

问题描述 投票:0回答:1

大约有100个包部署到SSIS服务器。所有的包都是一样的。他们都已经工作了很长时间。然而,在某一天,所有这些都开始失败并出现相同的错误:

“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005 描述:“无法确定元数据,因为 语句“选择前 1 个 1 [表名] 从 ( 选择前 1 名 1 [Ta' 与语句 'SELECT TOP 1 不兼容 1 [表名] FROM 系统。[表] 其中 1 = 0'。 结束错误 错误:2019-11-15 12:39:20.40 代码:0xC020204A
来源:描述:无法检索列 来自数据源的信息。确保您的目标表在 数据库可用。 结束错误错误:2019-11-15 12:39:20.42
代码:0xC004706B 来源:SSIS.Pipeline
描述:验证失败并返回验证 状态“VS_ISBROKEN”。 结束错误错误:2019-11-15 12:39:20.42
代码:0xC004700C 来源:SSIS.Pipeline
描述:一个或多个组件验证失败。 结束错误 错误:2019-11-15 12:39:20.43 代码:0xC0024107 来源:说明:任务验证期间出现错误。 结束错误 DTExec:包执行返回 DTSER_FAILURE (1)。 开始时间:12:39:19 PM 完成时间:12:39:20 PM 经过时间:1.234 秒。 包执行失败。 该步骤失败。

验证失败的语句的简化版本如下所示:

IF
(
    SELECT COUNT(*)
    FROM sys.[tables]
    WHERE [is_ms_shipped] = 0
          AND modify_date > '10/24/2019 11:33:00 AM'
) > 0
BEGIN
    SELECT TOP 1
           1 [TableName]
    FROM
    (
        SELECT TOP 1
                1 [TableName]
        FROM sys.[tables] AS T
        WHERE T.[is_ms_shipped] = 0
              AND T.modify_date > '10/24/2019 11:33:00 AM'
    UNION ALL
        SELECT TOP 1
                1 [TableName]
        FROM sys.views AS T
        WHERE T.[is_ms_shipped] = 0
              AND T.modify_date > '10/24/2019 11:33:00 AM'
    ) q
END;
ELSE
BEGIN
    SELECT TOP 1
           1 [TableName]
    FROM sys.[tables]
    WHERE 1 = 0;
END

两个选择都返回具有相同数据类型的相同列。 我知道我可以重写这个语句,这样就不会返回错误。 我对几个包执行了此操作并部署了它们。

但问题是,由于内部原因,封装无法轻易更换。我需要弄清楚发生了什么以及为什么所有软件包突然出现此错误,并恢复软件包工作的条件。 在问题发生的前一天,运行 SSIS 服务器的计算机上安装了以下 Windows 更新:

  • 2019-11 基于 x64 的 Windows Server 2016 累积更新 系统 (KB4525236)。 其中包括“...的安全更新 Microsoft JET 数据库引擎”
  • 2019-12 适用于基于 x64 的 Windows Server 2016 的服务堆栈更新 系统 (KB4520724)。 好像和 SQL 没什么关系。

我做了什么:

  • 我卸载了第一个更新 (KB4525236)。 (第二次更新 (KB4520724)无法卸载)
  • 我检查了 ODBC 驱动程序的版本,并将它们与安装在另一个环境中的版本进行了调整。 包仍然执行成功。

    ODBC 驱动程序版本

没有帮助。

使用的平台版本如下:

  • SSIS 服务器 – 版本 13.0.5101.9
  • 源服务器(通过 OLE DB 源访问 - 本机 OLE DB\SQL Server 本机客户端 11.0) – 版本 13.0.5492.2

预先感谢您的任何建议。

sql-server ssis odbc oledb
1个回答
0
投票

我遇到了同样的问题,并且可以使用 CTE 转换查询来解决。

我原来的查询: 如果@nu_id_tb034不为空并且@nu_id_tb034 <> 0开始 选择 a.NU_ID, a.NU_AGENCIA,
a.NU_OPERACAO, a.NU_CONTA, a.NU_DV, a.NU_CPF_CNPJ, a.DT_ABERTURA, a.NU_ID_TB001, a.CO_PERIODO 来自 DCETB005_SIDEC 作为 内连接 DCETB036_SOLICITACAO_CONTA 作为 b 在 b.NU_ID_TB034 = @nu_id_tb034 和 a.NU_AGENCIA = b.NU_AGENCIA 并且 a.NU_CONTA = b.NU_CONTA 并且 a.NU_DV = b.NU_DV_CONTA 和 a.NU_OPERACAO = b.NU_OPERACAO 在哪里 a.nu_id = ( 选择前 1 个 a1.nu_id 来自 DCETB005_SIDEC 作为 a1 在哪里 a1.NU_AGENCIA = a.NU_AGENCIA 和 a1.NU_CONTA = a.NU_CONTA 并且 a1.NU_DV = a.NU_DV 和 a1.NU_OPERACAO = a.NU_OPERACAO 按 a1.nu_id desc 排序 ) 结束否则开始 选择 NU_ID, NU_AGENCIA, NU_OPERACAO, NU_CONTA, NU_DV, NU_CPF_CNPJ, DT_阿贝图拉, NU_ID_TB001, CO_周期 来自 DCETB005_SIDEC 在哪里 co_periodo = @co_periodo 结尾; ——**************************************************** ****** 使用CTE的解决方案: ——**************************************************** ****** 声明@tb034_check位; 设置 @tb034_check = 当 @nu_id_tb034 不为 null 且 @nu_id_tb034 <> 0 时则为 1,否则为 0 结束;

Data_CTE 为 ( 选择 a.NU_ID, a.NU_AGENCIA,
a.NU_OPERACAO, a.NU_CONTA, a.NU_DV, a.NU_CPF_CNPJ, a.DT_ABERTURA, a.NU_ID_TB001, a.CO_PERIODO 来自 DCETB005_SIDEC 作为 左连接 DCETB036_SOLICITACAO_CONTA 作为 b 在@tb034_check = 1 b.NU_ID_TB034 = @nu_id_tb034 和 a.NU_AGENCIA = b.NU_AGENCIA 并且 a.NU_CONTA = b.NU_CONTA 并且 a.NU_DV = b.NU_DV_CONTA 和 a.NU_OPERACAO = b.NU_OPERACAO 在哪里 (@tb034_check = 1 和 a.nu_id = ( 选择前 1 个 a1.nu_id 来自 DCETB005_SIDEC 作为 a1 在哪里 a1.NU_AGENCIA = a.NU_AGENCIA 和 a1.NU_CONTA = a.NU_CONTA 并且 a1.NU_DV = a.NU_DV 和 a1.NU_OPERACAO = a.NU_OPERACAO 按 a1.nu_id desc 排序 )) 或者 (@tb034_check = 0 和 co_periodo = @co_periodo) ) 从Data_CTE中选择*;

© www.soinside.com 2019 - 2024. All rights reserved.