我有两个表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
时使用了合并语句......但没有得到。有人可以看看吗?
答案 0 :(得分:0)
你可以通过两种方式做到这一点, 1.在SSIS中,通过使用SCD转换或查找转换,您可以执行增量加载。 2.第二种方法是在Sql server中编写Merge语句,我们可以做增量加载。
答案 1 :(得分:0)
您可以将正在更新/插入product_source的“100条新记录”输出到临时表中。
然后将临时表连接到product_target表以进行插入/更新。
答案 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更无效。