将新行和某些更改从一个SQL DB表复制到另一个SQL DB表

时间:2018-02-23 12:54:26

标签: sql sql-server database

我在不同的服务器上有两个数据库。我在两者之间创建了一个链接,我希望在定时间隔内插入新数据和特定的更改数据,单向,有一些警告(如果它只是一个直的,一次性副本,我没有问题)。例如:

表1要复制的列:ID,H,W,D,名称,WO,RM,QTY,PN。

表2将具有相同的列,加上:Stage,SD。

我需要按照定时间隔将数据从Table1复制到Table2。该ID是唯一的,它需要检查是否有其他最初复制的数据发生了变化,如果是,则将其替换为新数据并添加新行。即使某些原始数据发生了变化,它也无法取代表2中其他列中的数据。

更新(示例)

Table1

ID      H   W   D   Name    WO      RM     QTY  PN
40101   32  32  12  Prod1   9501    Front   1   23.1
40102   12  12  6   Prod2   9501    Back    19  29.5
40103   18  36  12  Prod3   9502    Side    5   43.3


Table2

ID      H   W   D   Name    WO      RM      QTY PN      Stage       SD
40101   32  32  12  Prod1   9501    Front   1   23.1    2018-02-15  2018-02-22
40102   12  12  6   Prod2   9501    Back    19  29.5    2018-02-16  2018-02-22
40103   18  36  12  Prod3   9502    Side    5   43.3    2018-02-16  2018-02-22

如上图所示,Table1数据通过SQL插入查询复制到Table2; Table1中的列数多于显示的列数,但这些列是唯一包含的列。有时候Table1中的一行数据会发生变化,可能只有一列,或者除了ID之外的所有行。将数据复制到Table2时,它应插入新记录,更新现有行中已更改的列(仅从Table1复制的列),而不更新Table2中可能已有或可能尚未包含数据的其他列,例如Stage或表2中的SD列。

1 个答案:

答案 0 :(得分:0)

在这种情况下,使用Merge过程是最好的方法。这有效,但也取决于源表和目标表的任何约束。如果表格与data types , constraints正确对齐,则始终优化合并过程。

CREATE PROCEDURE TableInsert_Update
AS
BEGIN
    MERGE Table2 AS TARGET
    USING Table1 AS SOURCE
        ON (TARGET.id = SOURCE.id)
    WHEN MATCHED
        THEN
            UPDATE
            SET TARGET.col1 = SOURCE.col1
                ,TARGET.col2 = SOURCE.col2
                ,TARGET.col3 = SOURCE.col3
                ,TARGET.col4 = SOURCE.col4
                --add more columns      
    WHEN NOT MATCHED BY TARGET
        THEN
            INSERT (
                col1
                ,col2
                ,col3
                ,col4
                )
            --add more columns  
            VALUES (
                SOURCE.col1
                ,SOURCE.col2
                ,SOURCE.col3
                ,SOURCE.col4
                --add more columns
                );
END