更新或插入包含来自另一个表的所有记录的表

时间:2014-07-09 16:32:49

标签: sql sql-server insert

我将数据从一个数据库表导入到具有不同结构的另一个数据库表中,并且我使用此代码:

UPDATE BD1.dbo.Table1 
SET C2=t2.C2 
from BD2.dbo.Table2 as t2 
WHERE c1=t2.c1 collate SQL_Latin1_General_CP1_CI_AI 
IF @@ROWCOUNT=0 INSERT INTO  BD1.dbo.Table1 (c1,c2) 
select t2.c1, t2.c2 From BD2.dbo.Table2 as t2

如果我在BD1和BD2之间没有任何匹配,这可以正常工作,但如果我这样做,该命令只会更新现有字段。我想更新现有字段并创建新字段(?!) 我认为问题出现在@@ rowcount = 0,但我有一个where条件,它应该尊重记录,不是吗?

1 个答案:

答案 0 :(得分:2)

合并声明是为此操作编写的。如果记录存在,则称为UPSERT =更新记录,如果记录不存在则将其插入。

由于我没有您的架构,我无法测试下面的代码段。但这是一个可能适合您的TSQL示例。

-- UPSERT from staging to production
MERGE INTO 
    BD1.dbo.Table1 AS Target
USING 
    (SELECT C1, C2 FROM BD2.dbo.Table2) AS Source (C1, C2)
ON 
    Target.C1 = Source.C1 collate SQL_Latin1_General_CP1_CI_AI 
WHEN MATCHED THEN
    UPDATE SET Target.C2 = Source.C2
WHEN NOT MATCHED BY TARGET THEN
    INSERT (C1, C2) VALUES (Source.C1, Source.C2)
;
相关问题