我正在创建一个具有执行SQL任务的SSIS程序包,并将结果集变量传递给每个循环容器的。 我的Sql查询是:
Select distinct code from house where active=1 and campus='W'
我希望execute sql任务运行此查询并将其结果分配给一个变量,该变量将传递给每个循环容器,该循环容器应遍历结果集中的所有值。
但是我的执行sql任务失败并出现错误:
分配给变量的值的类型(DBNull) “ User :: house”与当前变量类型(字符串)不同
现在,我已经完成了研究,并且尝试分配变量数据类型Object,但是没有用。我尝试在SQL查询中使用强制转换,但这也无法正常工作。
由于我的查询返回多行和一列,因此我不确定如何为整个查询分配数据类型?
示例:
答案 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
。您也许可以使事情变得简单,但是总有一天您会将这段代码移交给其他人进行维护,而又不想使它们混淆。
答案 2 :(得分:0)