大约有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 更新:
我做了什么:
我检查了 ODBC 驱动程序的版本,并将它们与安装在另一个环境中的版本进行了调整。 包仍然执行成功。
没有帮助。
使用的平台版本如下:
预先感谢您的任何建议。
我遇到了同样的问题,并且可以使用 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中选择*;