我将数据从一个数据库表导入到具有不同结构的另一个数据库表中,并且我使用此代码:
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条件,它应该尊重记录,不是吗?
答案 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)
;