【问题标题】:Import data from Oracle to SQL server using SSIS使用 SSIS 将数据从 Oracle 导入 SQL Server
【发布时间】:2018-06-30 02:27:53
【问题描述】:

我们希望使用 SSIS 将数据从 Oracle 导入 SQL Server 我能够将数据从 Oracle 传输到 SQL 中的一个表(暂存)。然后我需要转换数据,我发现我需要运行存储过程来将数据从暂存数据转换为实际生产数据。但我想知道我们如何才能做到这一点。

编辑#1

  1. 源表有四列,其中一个字段包含日期,但其数据类型为字符串
  2. 目标表也有四列,但不会存储两列,因为源列和目标列之间存在映射
  3. 此映射存储在两个表中,两列都像表一个存储SourceFeatureIDDestincationFeatureID,类似地,第二个表存储SourcePIDDestincationPID
  4. 数据会定期更新,因此我们需要在上次更新时从目标数据中获取剩余的SourceDate > LastUpdated_destination_date

【问题讨论】:

  • 最好具体一点。你试过什么?什么是源结构?目的地结构?需要任何转换吗?
  • 所以......这个问题与oracle无关,而与如何编写存储过程有关?你想做什么实际的转变?那是您放置存储过程的代码。存储过程只是一堆使用变量和控制流的插入/更新/删除语句。首先你需要知道你需要做什么样的转换。是插入物吗?更新?你需要对暂存表中的数据做什么
  • 1.源表有四列,其中一个字段包含日期,但其数据类型为字符串 2。目标表也有四列,但不会存储两列,因为源列和目标列 4 之间存在映射。此映射存储在两个两列的表 就像表一存储 SourceFeatureID,DestincationFeatureID 类似,第二个表存储 SourcePID,DestincationPID 5。数据会定期更新,因此我们需要在上次更新时从目标数据中获取剩余的 SourceDate > LastUpdated_destination_date

标签: sql-server oracle ssis etl sql-server-data-tools


【解决方案1】:

更新 1:可用于在数据流任务中实现目标的组件

来源和目的地

  • OLEDB Source从临时表读取,您可以使用 SQL 命令仅返回 SourceDate > Destination Date 的数据

    SELECT * FROM StaggingTable T1 WHERE CAST(SourceDate as Datetime) > (SELECT MAX(DestDate) FROM DestinationTable)
    
  • OLEDB 目的地将数据插入生产数据库

加入其他表

  • 查找转换查找转换通过将输入列中的数据与参考数据集中的列连接来执行查找。您可以使用查找来访问相关表中基于公共列中的值的其他信息。
  • Merge JoinMerge Join 转换提供的输出是通过使用 FULL、LEFT 或 INNER 连接来连接两个已排序的数据集而生成的

转换列数据类型

  • 数据转换转换: 数据转换转换将输入列中的数据转换为不同的数据类型,然后将其复制到新的输出列
  • 派生列转换: 派生列转换通过将表达式应用于转换输入列来创建新列值。表达式可以包含来自转换输入的变量、函数、运算符和列的任意组合。结果可以作为新列添加或插入到现有列中作为替换值。派生列转换可以定义多个派生列,任何变量或输入列都可以出现在多个表达式中。

参考文献


初步回答

我发现我需要运行存储过程将数据从暂存数据转换为实际生产数据

这不是真的,您可以使用DataFlow Task进行数据传输。

有很多链接可以找到详细的解决方案:

使用 SSIS 执行存储过程

无论如何,要从 SSIS 执行存储过程,您可以使用 Execute SQL Task

附加信息:

【讨论】:

  • 感谢 OLEDB Source 我如何访问来自不同数据库和服务器的 StagingTable 和目标表
【解决方案2】:

我不会通过你的 cmets。我只是要发布一个将StagingTable 加载到TargetTable 的示例,以及一个日期转换的示例,以及一个使用映射表的示例。

这段代码创建存储过程

CREATE PROC MyProc
AS
BEGIN

    -- First delete any data that exists 
    -- in the target table that is already there
    DELETE TargetTable 
    WHERE EXISTS (
       SELECT * FROM StagingTable 
       WHERE StagingTable.SomeKeyColumn = TargetTable.SomeKeyColumn
    )


    -- Insert some data into the target table
    INSERT INTO TargetTable(Col1,Col2,Col3)

    -- This is the data we are inserting
    SELECT 
    ST.SoureCol1,    -- This goes into Col1
    -- This column is converted to a date then loaded into Col2
    TRY_CONVERT(DATE, ST.SourceCol2,112), 
    -- This is a column that has been mapped from another table
    -- That will be loaded into Col3
    MT.MappedColumn
    FROM StagingTable ST
    -- This might need to be an outer join. Who knows
    INNER JOIN MappingTable MT
    -- we are mapping using a column called MapCol
    ON ST.MapCol = MT.MapCol
END

此代码运行您刚刚创建的存储过程。您在 SSIS 包中的数据流之后将其放入执行 SQL 任务中:

EXEC MyProc

关于日期转换,请参阅此处了解编号样式:

【讨论】:

  • 这就是为什么我总是评论而不回答的原因。您没有提到暂存和目标位于不同的服务器上,这意味着此答案不适合您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2012-11-30
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多