执行SQL任务-全部结果集数据类型不匹配错误

时间:2018-10-28 12:20:25

标签: sql sql-server ssis

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

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

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

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

  

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

现在,我已经完成了研究,并且尝试分配变量数据类型Object,但是没有用。我尝试在SQL查询中使用强制转换,但这也无法正常工作。

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

示例:

  • 代码
  • AR
  • BN
  • CN

3 个答案:

答案 0 :(得分:0)

变量“ User :: house”是string,那么,您是否在结果集中使用了它?

答案 1 :(得分:0)

听起来这里有很多问题。

结果集

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

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

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

对于每个循环容器

然后为您的每个循环容器设置一个枚举器“ Foreach ADO Enumerator”,然后ADO对象源变量将变为“ User :: rsObject”

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

测试

给出一组源数据示例,您可以验证您的Execute SQL Task是否已正确地将结果集分配给我们的对象,并且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')

并且当“每个循环容器”达到该值时,您将遇到指示的错误

  

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

现在呢?

SSIS变量无法更改其数据类型,除非它们的类型为Object(但这不是解决方案)。 “问题”是您不能在SSIS变量中存储NULL值(除非它是object类型)。因此,您需要排除返回NULL(AND code IS NOT NULL)的行,或者需要将NULL强制转换为sentinel / placeholder值作为替代(SELECT DISTINCT ISNULL(code, '') AS code)。如果一个空字符串是一个有效值,那么您需要查找的不是-“ billinkcisthegreatestever10123432”在您的代码集中不太可能存在,但这可能有点过多。

最后,考虑将SSIS变量从house重命名为code。您也许可以使事情变得简单,但是总有一天您会将这段代码移交给其他人进行维护,而又不想使它们混淆。

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

答案 2 :(得分:0)

您需要为结果集声明子“对象”变量 result set

然后为结果中的每个代码声明一个字符串变量

For Each Loop Container 祝你好运