首页 文章

如何在SSIS中进行增量加载

提问于
浏览
0

我有Oracle 12C源和SQL Server目的地 . 在Fact表中,我需要每日快照(而不是整个数据),在Dimension表中我只需要新行,而不是整个表 . 似乎在Oracle方面不可能使用变量 . 什么是最好的方法?

1 回答

  • 1

    **

    仅取今天的数据:

    **我使用Attunity Oracle连接器取得了很好的成功 . 使用它们设置Oracle源时,可以将源定义为表/视图名称或SQL查询 . 执行此操作时,可以在查询中添加 WHERE 条件 .

    这种技术的简单版本如下所示:

    但是如果你想使用's not hard-coded in the query, you' ll需要创建表达式的日期 . 它类似,但是在数据流之前添加 Execute SQL Task ,并在那里构建动态sql查询并将其保存到变量中 . 然后,您可以使用该变量为Oracle Source SQL查询定义表达式 .

    使用与以前相同的表格,这是我如何提取最近3个月的记录:

    然后选择“数据流”任务并查看“属性”窗口 . 在"Misc"下,您应该看到 [Oracle Source].[SqlCommand] 的一行 . 您可以在此处进入表达式编辑器并将变量设置为SqlCommand .

    仅采用更新的行:

    为此,您可以使用一种技术,将源中的哈希值与目标中的哈希值进行比较,以确定行是否已更改 .

    您需要做的第一件事是导入所有数据,同时包括行数据的哈希值 .

    定义Oracle Source以将SQL命令用作数据访问模式 . 这是我的表的一个例子:

    SELECT
    CAST("Data Source Code" AS VARCHAR2(3)) AS "DataSourceCode"  
    ,"Matrix Id" AS "MatrixId"
    ,CAST("Primary Matrix Type" AS VARCHAR2(11)) AS "PrimaryMatrixType"  
    ,CAST("Branch Number" AS VARCHAR2(4)) AS "BranchId"
    ,"Effective Date" AS "EffectiveDate"
    ,"Expiration Date" AS "ExpirationDate"
    ,"Spa Flag" AS "SpaFlag"
    ,CAST("Default Contract Number" AS VARCHAR2(50)) AS "DefaultContractNumber"
    ,CAST("Direct Contract Number" AS VARCHAR2(50)) AS "DirectContractNumber"
    ,"Refresh Date" AS "RefreshDate"
    ,CAST(UPPER(RAWTOHEX(SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>
        CAST("Data Source Code" AS VARCHAR2(3)) || '|' ||
        "Matrix Id" || '|' ||
        CAST("Primary Matrix Type" AS VARCHAR2(11)) || '|' ||
        CAST("Branch Number" AS VARCHAR2(4)) || '|' ||
        CAST("Effective Date" AS VARCHAR2(30)) || '|' ||
        CAST("Expiration Date" AS VARCHAR2(30)) || '|'||
        "Spa Flag" || '|' ||
        CAST("Default Contract Number" AS VARCHAR2(50)) || '|' ||
        CAST("Direct Contract Number" AS VARCHAR2(50))
    ))) AS VARCHAR2(32)) AS "HashVal"
    FROM DWDIGITAL.CONTRACT_TABLE
    WHERE "Effective Date" >= TO_DATE('2018/01/01', 'yyyy/mm/dd')
    

    我在这里使用 SYS.DBMS_OBFUSCATION_TOOLKIT 生成MD5哈希值,使用所有行的列数据的连接字符串(确保将所有列转换为哈希的字符串) . 我使用 SYS.DBMS_OBFUSCATION_TOOLKIT 而不是 ORA_HASH ,因为我对Oracle服务器的权限有限, SYS.DBMS_OBFUSCATION_TOOLKIT 不需要像 ORA_HASH 这样的升级权限 . 我也在这里选择MD5,因为如果我需要在SQL端生成哈希值,事实上,我仍然可以生成相同的哈希值,因为SQL Server也可以使用MD5算法 . 如果您有权访问 ORA_HASH ,则可以使用其中一种SHA *算法 . 另外,请注意我在哈希计算中的每列之间添加 | . 这样 "My"+"text""Myt"+"ext" 将生成不同的哈希并防止误报,因为 My|textMyt|ext 是不同的 .

    因此,现在您的目标表已加载了数据和数据的哈希值 . 要创建迭代加载,首先需要从目标创建"cache"个键和哈希值 . 添加数据流任务,并创建指向目标表的源连接,并将管道直接指向流入 Cache Transform .

    缓存变换将用于在下一个DFT中执行查找变换 . 您需要配置缓存文件和要缓存的列 .

    我的主键设置为索引位置1 .

    下一个数据流将如下所示:

    此处的源连接将使用您在上面的初始加载期间使用的相同查询 . 然后创建一个Lookup Transform,并将缓存的HashVal添加为新列 .

    你应该在这里有两个输出 . "No Match"输出是来自源的行,其中目标中不存在该键 . 这些是要插入的新行 . 然后取"Matched"输出并将其指向"Conditional Split" . 条件分割将比较HashVals . 匹配HashVals表示该行没有变化 . 不匹配的HashVals表示记录已更改 . 我将这些记录加载到临时表中并使用存储的proc调用来执行 UPDATE 操作 .

相关问题