【发布时间】:2015-05-04 19:52:41
【问题描述】:
我已经创建了一个 ID 列表的查找和一个后续的 Foreach 循环来为每个 ID 运行一个 sql stmt。
用于捕获 ID 列表的变量称为 MissingRecordIDs,它的类型为 Object。在 Foreach 容器中,我将每个值映射到一个名为 RecordID 的 Int32 类型的变量。没有花哨的脚本 - 我按照以下说明操作:https://www.simple-talk.com/sql/ssis/implementing-foreach-looping-logic-in-ssis-/(没有文件加载部分 - 我只是在运行 SQL stmt)。
它在 SSIS 中运行良好,但是当我在 MSSQL 中部署我的集成服务目录时它失败了。
这是我从 SQL Mgt Studio 运行时遇到的错误:
我想我可以在 MissingRecordsID 被填充后放置一个优先约束以检查 NULL 并在必要时跳过 Foreach 循环 - 但我不知道如何在 Object 变量中检查 NULL?
这里是变量声明和枚举对象:
这里是变量映射:
“查找缺失订单”中的 SQL 语句:
select distinct cast(od.order_id as int) as order_id
from invman_staging.staging.invman_OrderDetails_cdc od
LEFT OUTER JOIN invman_staging.staging.invman_Orders_cdc o
on o.order_id = od.order_id and o.BatchID = ?
where od.BatchID = ?
and o.order_id is null
and od.order_id is not null
在当前环境中,此查询不返回任何内容 - 没有丢失的订单,所以我根本不想进入“Foreach 订单循环”。
【问题讨论】:
-
您不能对 Object 的数据类型应用任何表达式。您可以使用脚本任务来测试它,但不能使用表达式。将过滤器添加到您的 Execute SQL Task 以仅带回行
WHERE RecordID IS NOT NULL不是更干净吗? -
我在想 MissingRecordIDs 变量是空的 - 因此是 NULL。您认为其中一条记录是 NULL 吗?我可以过滤一下,我会试试的。
-
The type of the value (DBNull) being assigned to variable "User::RecordID" differs from the current variable type (Int32) -
我将建议的过滤器添加到 SQL 中,但没有任何区别。我可以看到当我在 SSIS 中运行包时,foreach 循环没有执行(我当前的数据没有 MissingRecordIDs)。在 SQL Mgt Studio 环境中似乎有些不同,我在想测试 NULL 并跳过循环会有所帮助......
-
我添加了截图并查询@billinkc
标签: sql-server foreach ssis