使用 WHERE 子句 "IN" 关键字创建 SSIS- SQL Task Oracle SQL 语句
Create SSIS- SQL Task Oracle SQL Statement With WHERE Clause "IN" keyword
我真的希望我能得到一些意见。我正在尝试使用 WHERE 子句中带有“IN”的 SQL 语句创建一个 SSIS 包(例如:SELECT * FROM Oracle.Table1 WHERE Col1 IN (?) )。基本上,Oracle SQL 语句的值来自 SQL 服务器 table。我已经搜索过,但找不到任何东西。任何建议将不胜感激:
- 我可以在对象变量中使用带有值的“IN”关键字吗?
- 我见过使用“ForEach”组件的方法。这不会为每个值创建一个 SELECT 语句吗?可能有数千条记录。
我试过以下方法:
使用 SQL 命令和语句:SELECT * FROM Oracle.Table1 WHERE Col1 IN (?) - where ?是一个对象变量(来自 SQL 服务器语句的结果集 1 列)
当我尝试 select“参数”时,我收到一条错误消息。
使用变量中的 SQL 命令和变量中的表达式:“SELECT * FROM Oracle.Table1 WHERE Col1 IN (” + @[User::Obj_values] + ")"
仅供参考:我只有对 Oracle 数据库的读取权限:(
热门问题
不,如果 SSIS 变量的类型是 Object
,则不能在表达式语言中执行任何操作
是的,foreach 方法需要对数组中的每个元素进行单独查询。
你试过的问题
参数替换不适用于值列表 - 如您所见
In 在 Oracle 中受支持,因此这种方法可行,但您必须 a) 使用字符串数据类型 b) 滚动您自己的逻辑来构建分隔列表。在 C# 任务中,它可能像 string.Join(",", Dts.Variables["User::Obj_values"].Value.ToArray());
一样微不足道,但可能不依赖于你如何填充对象数组的底层巫术
其他方法
根据数量以及 SQL 服务器中的键是否可以匹配 Oracle 中的(0 到 1)或(0 到多),您可以将数据流写为
- OLE DB 源(SQL 服务器查询)
- 查找组件 (Oracle)
- 任何目的地
在这种方法中,您从经过过滤的值列表开始,然后将其与您在 Oracle 中的引用 table 进行比较。如果引用 table 是“自成立以来纽约证券交易所的所有交易”是的,那是行不通的,但如果它是“我的所有客户”,那么您可以将该数据带入查找组件。
您可以尝试在部分缓存模式下使用查找来拆分差异。在这种方法中,它不是将整个目标 table 拉入内存,而是对每个元素触发查询,除非它已经看到键,在这种情况下它 re-uses 是一个本地缓存值。在这种方法和 foreach 枚举器方法之间,我倾向于通过查找组件触发查询,因为您不必为数据流任务的每次启动支付验证开销。鉴于这是 Oracle,这假定您有可用的 OLE DB 连接管理器。否则,您必须使用缓存连接管理器,顾名思义,它只能缓存 pre-defined 数据。
我真的希望我能得到一些意见。我正在尝试使用 WHERE 子句中带有“IN”的 SQL 语句创建一个 SSIS 包(例如:SELECT * FROM Oracle.Table1 WHERE Col1 IN (?) )。基本上,Oracle SQL 语句的值来自 SQL 服务器 table。我已经搜索过,但找不到任何东西。任何建议将不胜感激:
- 我可以在对象变量中使用带有值的“IN”关键字吗?
- 我见过使用“ForEach”组件的方法。这不会为每个值创建一个 SELECT 语句吗?可能有数千条记录。
我试过以下方法:
使用 SQL 命令和语句:SELECT * FROM Oracle.Table1 WHERE Col1 IN (?) - where ?是一个对象变量(来自 SQL 服务器语句的结果集 1 列) 当我尝试 select“参数”时,我收到一条错误消息。
使用变量中的 SQL 命令和变量中的表达式:“SELECT * FROM Oracle.Table1 WHERE Col1 IN (” + @[User::Obj_values] + ")"
仅供参考:我只有对 Oracle 数据库的读取权限:(
热门问题
不,如果 SSIS 变量的类型是 Object
,则不能在表达式语言中执行任何操作是的,foreach 方法需要对数组中的每个元素进行单独查询。
你试过的问题
参数替换不适用于值列表 - 如您所见
In 在 Oracle 中受支持,因此这种方法可行,但您必须 a) 使用字符串数据类型 b) 滚动您自己的逻辑来构建分隔列表。在 C# 任务中,它可能像
string.Join(",", Dts.Variables["User::Obj_values"].Value.ToArray());
一样微不足道,但可能不依赖于你如何填充对象数组的底层巫术
其他方法
根据数量以及 SQL 服务器中的键是否可以匹配 Oracle 中的(0 到 1)或(0 到多),您可以将数据流写为
- OLE DB 源(SQL 服务器查询)
- 查找组件 (Oracle)
- 任何目的地
在这种方法中,您从经过过滤的值列表开始,然后将其与您在 Oracle 中的引用 table 进行比较。如果引用 table 是“自成立以来纽约证券交易所的所有交易”是的,那是行不通的,但如果它是“我的所有客户”,那么您可以将该数据带入查找组件。
您可以尝试在部分缓存模式下使用查找来拆分差异。在这种方法中,它不是将整个目标 table 拉入内存,而是对每个元素触发查询,除非它已经看到键,在这种情况下它 re-uses 是一个本地缓存值。在这种方法和 foreach 枚举器方法之间,我倾向于通过查找组件触发查询,因为您不必为数据流任务的每次启动支付验证开销。鉴于这是 Oracle,这假定您有可用的 OLE DB 连接管理器。否则,您必须使用缓存连接管理器,顾名思义,它只能缓存 pre-defined 数据。