Sql server SSIS Foreach循环失败

Sql server SSIS Foreach循环失败,sql-server,foreach,ssis,Sql Server,Foreach,Ssis,我已经为ID列表创建了一个查找,并创建了一个后续的Foreach循环来为每个ID运行SQLSTMT 用于捕获ID列表的变量称为MissingRecordIDs,类型为Object。在Foreach容器中,我将每个值映射到一个名为RecordID的Int32类型变量。没有花哨的脚本-我遵循以下说明:(没有文件加载部分-我只是运行一个SQL stmt) 它在SSIS中运行良好,但当我在MSSQL中部署它时,我的集成服务目录失败了 这是我从SQL Mgt Studio运行时遇到的错误: 我想我可以

我已经为ID列表创建了一个查找,并创建了一个后续的Foreach循环来为每个ID运行SQLSTMT

用于捕获ID列表的变量称为MissingRecordIDs,类型为Object。在Foreach容器中,我将每个值映射到一个名为RecordID的Int32类型变量。没有花哨的脚本-我遵循以下说明:(没有文件加载部分-我只是运行一个SQL stmt)

它在SSIS中运行良好,但当我在MSSQL中部署它时,我的集成服务目录失败了

这是我从SQL Mgt Studio运行时遇到的错误:

我想我可以在MissingRecordSid被填充后设置一个Precendence约束来检查NULL,必要时跳过Foreach循环——但我不知道如何在对象变量中检查NULL

下面是变量声明和枚举对象:

这是变量映射:

“查找缺少的订单”中的SQL stmt:

 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订单循环”。

这是Microsoft注意到的一个已知问题:


我建议在查询中添加一个ISNULL(RecordID,0),并为组件“LoadMissing Orders”设置一个表达式,以便仅在RecordID!=0.

在我的情况下,导致问题的不是NULL,我从数据库加载的ID值被存储为nvarchar(50),即使它是一个整数,我也尝试在SSIS中将其用作整数,但它一直给我相同的错误消息,这对我有效:

SELECT CAST(id as INT) FROM dbo.Table

不能对对象的数据类型应用任何表达式。可以使用脚本任务对其进行测试,但不能使用表达式。如果只在执行SQL任务中添加一个过滤器,只返回RecordID不为NULL的行,这不是更干净吗?我认为MissingRecordId变量为空,因此为NULL。你认为其中一条记录是空的?我可以对此进行筛选,我会尝试。
分配给变量“User::RecordID”的值(DBNull)的类型与当前变量类型(Int32)不同。
我将建议的筛选添加到SQL中,但没有任何区别。我可以看到,当我在SSIS中运行包时,foreach循环不会执行(使用我的当前数据,没有丢失的RecordId)。在SQL Mgt Studio环境中似乎有些不同,我认为测试NULL和跳过循环会有所帮助……我添加了屏幕截图和query@billinkcThis,这很有帮助,但我没有看到这一点,所以我将其标记为答案。但我的问题似乎有点不寻常。我还遇到了一些其他连接问题-因此我从SSMS中删除了我的SSIS项目,并仔细地重新检查了SSIS中的所有连接-确保它们是正确的身份验证类型和服务器,然后重新部署。现在一切都好了。不确定如何-但我认为连接字符串导致了不可预测的行为。