【问题标题】:SSIS Foreach Loop failureSSIS Foreach 循环失败
【发布时间】: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


【解决方案1】:

这是 Microsoft 知道的一个已知问题:https://connect.microsoft.com/SQLServer/feedback/details/742282/ssis-2012-wont-assign-null-values-from-sql-queries-to-variables-of-type-string-inside-a-foreach-loop

我建议在查询中添加一个 ISNULL(RecordID, 0) 并为组件“加载缺失的订单”设置一个表达式,以便仅在 RecordID != 0 时启用它.

【讨论】:

  • 这很有帮助,但我没有看到 - 所以我将其标记为答案。但似乎我的问题有点不寻常。我也遇到了其他一些连接问题——所以我从 SSMS 中删除了我的 SSIS 项目,并仔细检查了 SSIS 中的所有连接——确保它们是正确的身份验证类型和服务器,然后重新部署。现在一切正常。不知道如何 - 但我认为连接字符串导致了不可预测的行为。
【解决方案2】:

在我的情况下,导致问题的不是 NULL,我从数据库加载的 ID 值存储为 nvarchar(50),即使它是一个整数,我尝试在 SSIS 中将它用作整数并且它保留给我同样的错误信息,这对我有用:

SELECT CAST(id as INT) FROM dbo.Table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多