sql - 执行 SQL 任务 - 完整结果集数据类型不匹配错误
问题描述
我正在创建一个具有执行 SQL 任务的 SSIS 包,并将结果集变量传递给每个循环容器。我的 Sql 查询是:
Select distinct code from house where active=1 and campus='W'
我希望执行 sql 任务运行此查询并将其结果分配给一个变量,该变量传递给每个循环容器,该容器应遍历结果集中的所有值。
但是我的执行 sql 任务失败并出现错误:
分配给变量“User::house”的值类型 (DBNull) 与当前变量类型 (String) 不同
现在我已经完成了我的研究,我尝试分配变量数据类型 Object 但没有工作。我尝试在我的 sql 查询中使用 cast,但也没有用。
由于我的查询返回多行和一列,我不确定如何为整个查询分配数据类型?
样本:
- 代码
- 增强现实
- 国阵
- 中国
解决方案
听起来你在这里有各种各样的问题。
结果集
第一个是在您的执行 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 变量从 重命名house
为code
。您可能能够保持直截了当,但有一天您会将这段代码交给其他人进行维护,并且您不想混淆他们。
推荐阅读
- ruamel.yaml - Ruamel.yaml moves comment to the next line when preceded by an anchor
- angular - Why do I get 404 error when trying to send specific POST requests to Nest JS server?
- workflow - Set work order status to release with workflow
- file-upload - Apache Airflow | Invoking check/script to validate the upload file/content type
- android - showing black screen on backpress Flutter
- php - How do I load the contents in $temporary_html_file_BOP in the 2nd Sheet?
- error-handling - 在 Rust 中使用 and_then 有条件地处理特定错误
- sql - Do PostgreSQL server side cursors store the results to disk?
- java - 一个微服务的 tomcat 9 和 10 战争文件部署给出“无法访问此站点连接已重置。” 错误页面
- python - 使用 python 3 将数组条目与真实的 ArcMap 坐标相关联