首页 > 解决方案 > 执行 SQL 任务 - 完整结果集数据类型不匹配错误

问题描述

我正在创建一个具有执行 SQL 任务的 SSIS 包,并将结果集变量传递给每个循环容器。我的 Sql 查询是:

Select distinct code from house where active=1 and campus='W'

我希望执行 sql 任务运行此查询并将其结果分配给一个变量,该变量传递给每个循环容器,该容器应遍历结果集中的所有值。

但是我的执行 sql 任务失败并出现错误:

分配给变量“User::house”的值类型 (DBNull) 与当前变量类型 (String) 不同

现在我已经完成了我的研究,我尝试分配变量数据类型 Object 但没有工作。我尝试在我的 sql 查询中使用 cast,但也没有用。

由于我的查询返回多行和一列,我不确定如何为整个查询分配数据类型?

样本:

标签: sqlsql-serverssis

解决方案


听起来你在这里有各种各样的问题。

结果集

第一个是在您的执行 SQL 任务中,并且需要在Result Set规范和结果集选项卡中指定的变量的数据类型之间达成一致。如果您指定完整结果集,则接收对象必须是 System::Object 类型,并且您将只有 1 个结果集。使用的连接管理器 (ODBC/OLE/ADO) 的类型将决定您如何指定它,但在这些精美的论坛上可以无限搜索。

其他两个选项是单行和 XML。在使用 SSIS 的 13 年中,我从来没有理由指定 XML。这给我们留下了单行。对于单行结果集,您需要为返回的每一列提供一个变量,并且需要正确键入。

要更正您的问题,您需要声明第二个变量。我通常调用我的 rsObject(记录集对象),然后将数据类型指定为 System.Object。

对于每个循环容器

然后将使用“Foreach ADO 枚举器”的枚举器设置您的 For Each 循环容器,然后 ADO 对象源变量将变为“User::rsObject”

在变量映射中,您需要将变量 User::house 指定为索引 0。

测试

给定一组源数据样本,您可以验证您的执行 SQL 任务是否正确地将结果集分配给我们的对象,并且 Foreach 循环容器是否正确填充了我们的变量。

SELECT DISTINCT
    code
FROM
(
    VALUES
        ('ABC', 1, 'w')
    ,   ('BCD', 1, 'w')
    ,   ('CDE', 0, 'w')
    ,   ('DEF', 1, 'w')
    ,   ('EFG', 1, 'x')
) house(code, active, campus)
WHERE
    active = 1
    AND campus = 'w';

如果您将校园的价值w从不存在的东西更改为不存在的东西,f那么事情将继续有效。

但是,只有当代码为 NULL 时才会生成您收到的错误

向 VALUES 集合再添加一个条目,例如

    ,   (NULL, 1, 'w')

当 For Each Loop Container 达到该值时,您将遇到您指示的错误

分配给变量“User::house”的值类型 (DBNull) 与当前变量类型 (String) 不同

怎么办?

SSIS 变量不能更改它们的数据类型,除非它们是 Object 类型(但这不是这里的解决方案)。“问题”是您不能在 SSIS 变量中存储 NULL 值(除非它是对象类型)。因此,您需要排除返回 NULL ( AND code IS NOT NULL) 的行,或者您需要将 NULL 转换为哨兵/占位符值作为替代 ( SELECT DISTINCT ISNULL(code, '') AS code)。如果空字符串是有效值,那么您需要找到不存在的内容 - “billinkcisthegreatestever10123432”不太可能存在于您的代码集中,但这可能有点过分。

最后,考虑将 SSIS 变量从 重命名housecode。您可能能够保持直截了当,但有一天您会将这段代码交给其他人进行维护,并且您不想混淆他们。

一个风景如画的答案https://stackoverflow.com/a/13976990/181965


推荐阅读