用于比较表_1和表_2并根据表_1中更改的数据更新表_2的存储过程

时间:2018-08-29 09:48:29

标签: sql sql-server database stored-procedures stored-functions

假设我有两个表Table_1和Table_2。

两者都有相同的列。

@Table_1

| Id | Col1 | Col2 | Col3 |
| 1  |   a  |   b  |  c   |
| 2  |   d  |   e  |  f   |

@Table_2

| Id | Col1 | Col2 | Col3 |
| 1  |   a  |   0  |  0   |
| 3  |   z  |   z  |  y   |

如何编写存储过程,该存储过程将从Table_1中获取行,并将该行的每一列与Table_2中的行进行比较,并相应地更新Table_2列。而且,如果在Table_1中找不到Table_2中的行,则只需将其插入。

现在。我意识到INSERT易于编写,可能看起来像

insert into @Table_2(col1, col2, col3)
select col1, col2, col3 from @Table_1 where id = @id

执行存储过程后,Table_2的最终结果必须如下所示

@Table_2

| Id | Col1 | Col2 | Col3 |
| 1  |   a  |   b  |  c   |
| 2  |   d  |   e  |  f   |
| 3  |   z  |   z  |  y   |

如何比较Table_1的每一行和每一列与Table_2中的数据?

@Martyn Meeks的答案是两个单独的陈述!

根据用户@SQL_M使用MERGE语句提供的https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/并不完美,但可以正常工作

@Jayasurya Satheesh的脚本也可以使用,但是使用MERGE语句

3 个答案:

答案 0 :(得分:2)

如果您担心上述提到的MERGE语句存在潜在问题,可以在两个单独的语句中完成

    UPDATE T2
    SET T2.Col1 = T1.Col1,
        T2.Col2 = T1.Col2,
        T2.Col3 = T1.Col3
    FROM @Table_2 T2
    INNER JOIN @Table_1 T1
    ON T2.Id = T1.Id

    INSERT INTO @Table_2 (Id,Col1,Col2,Col3)
    SELECT T1.Id,T1.Col1,T1.Col2,T1.Col3
    FROM @Table_1 T1
    WHERE NOT EXISTS (SELECT 1 FROM @Table_2 T2 WHERE T2.Id = T1.Id)

编辑:按照Jayasurya的建议切换更新和插入语句。 否则,新插入的行将被更新以及被插入,这是不必要的

答案 1 :(得分:1)

使用单个语句插入和更新可以使用SQL Merge Join

就像下面的示例一样:

MERGE Table1 T1
    USING Table2 T2
        ON T1.Id = T2.Id
    WHEN MATCHED
        UPDATE SET 
            T1.Col1 = T2.Col1,
            T1.Col2 = T2.Col2,
            T1.Col3 = T2.Col3
    WHEN NOT MATCHED BY TARGET
        INSERT(COL1,COL2,COL3)
        VALUES(T2.COL1,T2.COL2,T2.COL3)

如果根据ID找到匹配项,则在这里更新Table1上的记录,否则如果没有匹配项,则插入记录

答案 2 :(得分:1)

创建MERGE语句。

CREATE PROCEDURE [dbo].[IMPORT_Data]

AS

SET NOCOUNT ON;

MERGE Table1 AS TRGT
USING Table2 AS SRCE
   ON SRCE.Id = TRGT.Id
WHEN MATCHED THEN UPDATE 
        SET TRGT.Col1 = SRCE.Col1,
            TRGT.Col2 = SRCE.Col2,
            TRGT.Col3 = SRCE.Col3,
            TRGT.Col4 = SRCE.Col4
WHEN NOT MATCHED BY TARGET THEN 
            INSERT
            (
                Col1,
                Col2,
                Col3,
                Col4
            )
            VALUES
            (
                SRCE.Col1,
                SRCE.Col2,
                SRCE.Col3,
                SRCE.Col4
            )
WHEN NOT MATCHED BY SOURCE THEN 
          DELETE;