1

我真的希望我能得到一些意见。我正在尝试使用 WHERE 子句中带有“IN”的 SQL 语句创建一个 SSIS 包(例如: SELECT * FROM Oracle.Table1 WHERE Col1 IN (?) )。基本上,一个带有来自 SQL Server 表的值的 Oracle SQL 语句。我已经搜索过,找不到任何东西。任何建议将不胜感激:

  1. 我可以在对象变量中使用带有值的“IN”关键字吗?
  2. 我见过使用“ForEach”组件的方法。这不会为每个值创建一个 SELECT 语句吗?可能有数千条记录。

我尝试了以下方法:

  1. 使用带有语句的 SQL 命令:SELECT * FROM Oracle.Table1 WHERE Col1 IN (?) - where ? 是一个对象变量(来自 SQL Server 语句的结果集 1 col)当我尝试选择“参数”时,我收到一条错误消息。

  2. 使用变量中的 SQL 命令和变量中的表达式:"SELECT * FROM Oracle.Table1 WHERE Col1 IN (" + @[User::Obj_values] + ")"

仅供参考:我只有 Oracle DB 的读取权限 :(

4

1 回答 1

1

热门问题

  1. 不,如果 SSIS 变量是 Object 类型,则您不能在表达式语言中执行任何操作

  2. 是的,foreach 方法需要对数组中的每个元素进行单独的查询。

你尝试过的问题

  1. 参数替换不适用于值列表 - 正如您所观察到的

  2. Oracle 支持In,因此这种方法可以使用,但您必须 a) 使用字符串数据类型 b) 滚动您自己的逻辑来构建分隔列表。在 C# 任务中,它可能很简单,string.Join(",", Dts.Variables["User::Obj_values"].Value.ToArray());但可能不取决于您如何填充对象数组的底层巫术

其他方法

根据数量以及 SQL Server 中的键是否可以匹配 Oracle 中的(0 到 1)或(0 到多个),您可以将数据流编写为

  • OLE DB 源(SQL Server 查询)
  • 查找组件 (Oracle)
  • 无论目的地

在这种方法中,您从筛选的值列表开始,然后将其与 Oracle 中的参考表进行比较。如果参考表是“自成立以来纽约证券交易所的所有交易”是的,那是行不通的,但如果它是“我的所有客户”,那么您可能可以将该数据带入查找组件。

您可以尝试通过在部分缓存模式下使用查找来拆分差异。在这种方法中,它不是将整个目标表拉入内存,而是为每个元素触发一个查询,除非它已经看到了键,在这种情况下它会重新使用本地缓存的值。在这种方法和 foreach Enumerator 方法之间,我倾向于通过查找组件触发查询,因为您不必为数据流任务的每次启动支付验证开销。鉴于这是 Oracle,这假定您有一个可用的 OLE DB 连接管理器。否则,您必须使用缓存连接管理器,顾名思义,它只能缓存预定义的数据。

于 2020-09-15T14:39:28.767 回答