使用SSIS将数据从Oracle导入SQL服务器

时间:2018-01-21 08:22:08

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

我们希望使用SSIS从Oracle导入数据到SQL服务器 我能够将数据从Oracle传输到SQL中的一个表(Staging)。然后我需要转换数据,我发现我需要运行存储过程来将数据从Staging转换为Actual生产数据。但我想知道我们怎么做。

enter image description here

编辑#1

  1. 源表有四个列,其中一个字段包含日期,但其数据类型为字符串
  2. 目标表还有四列但不会存储两列,因为源列和目标列之间存在映射
  3. 此映射存储在两个表中,用于两列。如表一存储SourceFeatureIDDestincationFeatureID类似第二表存储SourcePIDDestincationPID
  4. 数据会定期更新,因此我们需要最后更新的目标数据,并在SourceDate> LastUpdated_destination_date

2 个答案:

答案 0 :(得分:1)

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

来源和目的地

  • OLEDB源从登台表读取,您可以使用SQL命令仅返回包含SourceDate>的数据。目的地日期

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

加入其他表格

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

转换列数据类型

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

参考

初步答案

  

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

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

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

使用SSIS执行存储过程

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

其他信息:

答案 1 :(得分:0)

我不打算通过你的评论。我将发布一个将StagingTable加载到TargetTable的示例,其中包含日期转换的示例,以及使用映射表的示例。

此代码创建存储的proc

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

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