首页 > 解决方案 > 如何在 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 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......但没有得到。有人可以调查一下吗?

标签: sqlsql-server

解决方案


假设表上的主键是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 组件是一个“破坏性向导”——它每次都会删除并重新创建流。查找组件也比 T-SQL 效率低。


推荐阅读