【问题标题】:Passing values from a table to Oracle query in dataflowtask?在dataflowtask中将值从表传递到Oracle查询?
【发布时间】:2014-05-16 18:15:49
【问题描述】:
Employee:

EmployeeID     EmployeeName      EmployeeNumber     StartDate        StopDate
   1            Tom                 7887             3/1/2014         3/1/2015
   2            Harry               7888             3/1/2013         3/1/2015
   3            Frank               7889             3/1/2012         3/1/2015
   4            John                7890             3/1/2011         3/1/2015

我在 Sql Server 中有一个 Employee 表。我正在使用员工信息将值传递给 Oracle 查询,以使用数据流任务从 Oracle 获取数据。 但我从未尝试过使用 pl/sql,因为它看起来与 sql 不同。 我的 oracle 查询看起来像

SELECT *
    FROM Components A INNER JOIN Values b
    on A.Rowid=B.Rowid
    and A.Contact IN(:EmployeeName)
    and A.Sub IN(:EmployeeNumber )
    WHERE
A.time BETWEEN TO_DATE(:StartDate) AND TO_DATE(:EndDate) + 0.99999


How can I pass my Employee table values in to above sql query using for loop Container.

【问题讨论】:

  • 想留下评论 Mr Down Voter??
  • NOT THE DOWN VOTER :) -- 你的循环容器会循环什么?换句话说,Oracle 查询是否会因每个 EmployeeName、EmployeeNumber 组合而被触发?
  • @godzilla2014 是的,应该为每个 EmployeeName, EmployeeNumber 触发 oracle 查询。
  • “我正在寻找如何使用 SSIS 中的 for 循环容器将值从表传递到 SP 中的变量。”您现在使用的是 Oracle SP 而不是查询?或者您在将变量传递给查询时遇到任何问题?
  • @godzilla2014:我正在使用执行 sql 任务从表中获取所有值。我的下一步是我使用每个循环容器,其中我为变量获取单行。我如何首先分配行值到用户定义的变量:EmployeeID、EmployeeName、EmployeeNumber、StartDate、StopDate,这样我就可以在 DFT 中为 Oracle 源代码使用它们??

标签: sql-server sql-server-2008-r2 oracle-sqldeveloper ssis


【解决方案1】:

您可以像查询 SQL Server 一样查询 Oracle。在您的情况下,您必须从查找变量中构建 Oracle 查询。例如,您的变量 ExtractSQL 将是如下表达式-

"选择 * FROM 组件 A INNER JOIN 值 b A.Rowid=B.Rowid 和 A.Contact = '" + @[User::EmployeeName] +"' 和 A.Sub ='"+ @[User::EmployeeNumber] + "' WHERE A.time BETWEEN TO_DATE('"+ @[User::StartDate] +"') AND TO_DATE('"+ @@[User::EndDate] +"') + 0.99999"

根据您最终存储日期的方式,您可能需要将第二个参数传递给 To_Date 函数,格式为 Eg. TO_DATE ('2014-05-14 15:01:27' , 'YYYY-MM-DD HH24:MI:SS')

-回答您关于设置变量的问题。

  1. 创建一个名为“Object”类型的 EmployeeRecordset 变量。

  2. 在结果集选项卡的执行 SQL 任务中,将结果名称 0 和变量名称设置为 User::EmployeeRecordset。

  3. 在您的 for each 循环中,将枚举器设置为 ForEach ADO 枚举器,将 ADO 对象源变量设置为 User::EmployeeRecordset。枚举模式,您可以将其保留为第一个表中的行。

  4. 在变量映射中设置行级变量 - 即员工编号、员工姓名等,按照从索引 0 开始的查询返回顺序。

现在您应该能够使用循环内的变量来形成您的 Oracle 查询。

【讨论】:

  • 非常感谢 Brother。对 oracle 的输入必须类似于 2014 年 5 月 14 日。
  • 这是默认设置,但您可以使用 To_DATE 函数的第二个参数来控制格式。不管怎样,很高兴我能帮上忙……
  • 行号“15”、字符号“32”处的单引号不是预期的。
  • 您的引号顺序错误,您还需要 () 将员工姓名括起来以使“IN”工作 - “SELECT * FROM Components A WHERE A.Contact IN ('"+ @ [员工姓名]+"')"
  • 您能检查为@[User::StartDate] 和@[User::EndDate] 设置的值的格式吗?显然 (DT_WSTR, 10) 正在截断字符串。不要将变量 @[User::StartDate] 和 @[User::EndDate] 作为日期时间类型,而是将它们作为字符串类型。
【解决方案2】:

应该是这样的:

  1. 用于构建行集的数据流任务 (DFT1) - 我们将在 Oracle 中循环。
  2. 用户定义变量:@EmployeeID、@EmployeeName、@EmployeeNumber、@StartDate、@StopDate
  3. DFT1 - 将数据加载到记录集目标的 sql 查询。您可以根据需要编写查询来格式化数据,例如,将@StartDate 定义为字符串并将“3/1/2014”转换为 Oracle 中所需的日期格式
  4. 现在对 Ado .NET 记录集使用 foreachLoop 枚举器并循环遍历。
  5. 在foreachLoop 枚举器中,您应该有数据流任务,它使用上面的变量来使用表达式形成SQL 语句(意味着在Oracle 中执行)。您将需要在此处使用表达式选项中的 SQL 命令
  6. 目的地!

【讨论】:

  • 我很困惑如何将我的第一行值分配给用户定义的变量:EmployeeID、EmployeeName、EmployeeNumber、StartDate、StopDate。
  • 你可以看到它herehere。这是循环所有记录的最简单方法。
猜你喜欢
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多