如何在SQL Server中进行增量加载

时间:2018-05-30 01:15:14

标签: sql sql-server

我有两个表product_source(有50条记录)和product_target(没有记录)。

create table product_source
(
     productId varchar(10),
     productName varchar(50),
     productStatus varchar(20),
     productType varchar(20),
     productDesc varchar(50)
)

create table product_target
(
     productId varchar(10),
     productName varchar(50),
     productStatus varchar(20),
     productType varchar(20),
     productDesc varchar(50)
)

product_source表中的示例数据:

productId productName   productStatus productType productDesc   
-------   ----------     -----------  -----------  -----------  
111          lenova       pending      computer   hp_computer   
222          pendrive     delivered    gadget     storage
777          harddisk     pending      storage    storagedevice
...50 records

我使用insert语句将数据加载到目标表中。例如。

insert into product_target as 
    select * 
    from product_source     -- 50 records loaded

product_target表:

productId productName   productStatus productType productDesc    
-------   ----------     -----------  -----------  -----------   
111          lenova       pending      computer   hp_computer   
222          pendrive     delivered    gadget     storage
...50 records got loaded

现在再次将一些数据(例如100条新记录)加载到源表product_source中,现在如何仅将那100条新记录加载到product_target表中,列is_status说明是否在源代码中插入/更新的任何新记录然后应添加如下。

product_source表(带有新记录):

productId productName   productStatus productType productDesc   
-------   ----------     -----------  -----------  -----------  
111          samsung       delivered    mobile     sam_mobile     
989          scandisk     inprogress    pendrive   pendrive_64gb
546          mouse        inprogress    computer   mouse_computer
666          keyboard     inprogress    computer   keyboard_computer
777          harddisk     delivered     storage    storagedevice
...100 records

product_target表:

productId productName   productStatus productType productDesc    Is_status
-------   ----------     -----------  -----------  -----------   ----------
555          lenova       pending       computer   hp_computer       inserted
111          lenova       delivered     computer   hp_computer       updated  
777          harddisk     delivered     storage    storagedevice     updated
989          scandisk     inprogress    pendrive   pendrive_64gb     inserted
546          mouse        inprogress    computer   mouse_computer    inserted
666          keyboard     inprogress    computer   keyboard_computer inserted
...

同样如果在product_source表中每天都发生加载,那么如何加载product_target表中记录的每个新插入/更新的内容?

我在从product_source加载到product_target时使用了合并语句......但没有得到。有人可以看看吗?

3 个答案:

答案 0 :(得分:0)

你可以通过两种方式做到这一点, 1.在SSIS中,通过使用SCD转换或查找转换,您可以执行增量加载。 2.第二种方法是在Sql server中编写Merge语句,我们可以做增量加载。

答案 1 :(得分:0)

您可以将正在更新/插入product_source的“100条新记录”输出到临时表中。

然后将临时表连接到product_target表以进行插入/更新。

http://www.sqlservercentral.com/articles/T-SQL/156204/

答案 2 :(得分:0)

假设桌面上的主键是productId

insert into product_target (
 productId,
 productName,
 productStatus,
 productType,
 productDesc
 )
    select 
 productId,
 productName,
 productStatus,
 productType,
 productDesc
    from product_source SRC
    WHERE NOT EXISTS (SELECT * FROM product_target TGT 
                      WHERE TGT.productID = SRC.ProductId);

注意:在插入和选择时,总是使用列表。

在我看来:

不要使用临时表来存储您插入的内容。这是多余的,而且过于复杂,因为你已经知道目标表中有什么,所以为什么要将它存储在另一个单独的表中

我建议您不要使用SSIS来执行此操作。在源表和目标表位于同一数据库中的情况下,除非您有更广泛的要求(如日志记录,配置,复杂的调度,大量表等),否则T-SQL解决方案通常是最佳的。对于大型数据集来说,SCD组件效率很低(对于几千条记录来说它很好但是不习惯使用它)。此外,SCD组件是一个“破坏性”向导' - 它每次都删除并重新创建流。 Lookup组件也比T-SQL更无效。