[英]Execute SQL Task -Full Result Set Datatype Mismatch Error
我正在创建一个具有执行SQL任务的SSIS程序包,并将结果集变量传递给每个循环容器的。 我的SQL查询是:
Select distinct code from house where active=1 and campus='W'
我希望execute sql任务运行此查询并将其结果分配给一个变量,该变量将传递给每个循环容器,该循环容器应遍历结果集中的所有值。
但是我的执行sql任务失败并出现错误:
分配给变量“ User :: house”的值的类型(DBNull)与当前变量类型(String)不同
现在,我已经完成了研究,并尝试分配了变量数据类型Object,但是没有用。 我尝试在SQL查询中使用强制转换,但也无法正常工作。
由于查询返回多行和一列,因此我不确定如何为整个查询分配数据类型?
样品:
变量“ User :: house”是string,那么,您是否在结果集中使用了它?
听起来您这里有很多问题。
首先是在Execute SQL Task中,并且需要在Result Set
规范和“结果集”选项卡中指定的变量的数据类型之间达成协议。 如果指定完整结果集,则接收对象的类型必须为System :: Object,并且将只有1个结果集。 使用的连接管理器(ODBC / OLE / ADO)的类型将确定如何指定它,但是在这些高级论坛上可以无限地搜索它。
其他两个选项是“单行”和“ XML”。 在使用SSIS的13年中,我从来没有理由指定XML。 剩下的就是单行。 对于单行结果集,您需要为返回的每一列提供一个变量, 并且需要正确键入。
若要更正您的问题,您需要声明第二个变量。 我通常调用rsObject(记录集对象),然后将数据类型指定为System.Object。
然后,将为您的For Each循环容器设置一个带有“ 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强制转换为哨兵/占位符值(作为替代SELECT DISTINCT ISNULL(code, '') AS code
)( SELECT DISTINCT ISNULL(code, '') AS code
)。 如果一个空字符串是一个有效值,那么您需要查找的不是-“ billinkcisthegreatestever10123432”在您的代码集中不太可能存在,但是可能有点过多。
最后,考虑将SSIS变量从house
重命名为code
。 您也许可以使事情变得简单,但是总有一天您会将这段代码移交给其他人进行维护,而又不想让他们感到困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.