Sql 通过插入或更新将数据从一个表复制到另一个表
我需要将大量数据从一个表复制到另一个表。如果数据已经存在,我需要更新它,否则我需要插入它。要复制的数据正在使用WHERE条件进行选择。数据有一个主键(最多12个字符的字符串) 如果我只是插入数据,我会这样做Sql 通过插入或更新将数据从一个表复制到另一个表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要将大量数据从一个表复制到另一个表。如果数据已经存在,我需要更新它,否则我需要插入它。要复制的数据正在使用WHERE条件进行选择。数据有一个主键(最多12个字符的字符串) 如果我只是插入数据,我会这样做 INSERT INTO T2 SELECT COL1, COL2 FROM T1 WHERE T1.ID ='I' 但是我不知道如何进行插入/更新。我一直看到对upsert和MERGE的引用,但是MERGE似乎有问题,我不知道如何对多个记录执行upsert 最好的解决方案是什么?如果你想避
INSERT INTO T2 SELECT COL1, COL2 FROM T1 WHERE T1.ID ='I'
但是我不知道如何进行插入/更新。我一直看到对upsert和MERGE的引用,但是MERGE似乎有问题,我不知道如何对多个记录执行upsert
最好的解决方案是什么?如果你想避免合并(尽管你不应该害怕),你可以这样做
update t2
set col1 = t1.col1
,col2 = t1.col2
from t2
join t1
on t2.[joinkey] = t1.[joinkey]
where [where clause]
之后是你没有的
insert into t2(col1,col2)
select col1,col2 from t1
where not exists (select * from t2 where t1.[joinkey] = t2.[joinkey])
通过这种方式,首先更新匹配的,然后插入不匹配的。此外,如果您希望一次性完成,您可以将其包装在事务中。如果存在,您可以使用
,例如:
if exists (select * from table with (updlock,serializable) where key = @key)
begin
update table set ...
where key = @key
end
else
begin
insert table (key, ...)
values (@key, ...)
end
另一种解决方案是检查@@ROWCOUNT
UPDATE MyTable SET FieldA=@FieldA WHERE Key=@Key
IF @@ROWCOUNT = 0
INSERT INTO MyTable (FieldA) VALUES (@FieldA)
这通常被称为UPSERT
操作。是的,你说合并有一些问题是正确的,所以远离它
假设两个表中都有一个名为PK\u Col
的主键列,一种简单的方法是这样的
BEGIN TRANSACTION;
-- Update already existing records
UPDATE T2
SET T2.Col1 = T1.Col1
,T2.Col2 = T1.Col2
FROM T2 INNER JOIN T1 ON T2.PK_COl = T1.PK_Col
-- Insert missing records
INSERT INTO T2 (COL1, COL2 )
SELECT COL1, COL2
FROM T1
WHERE T1.ID ='I'
AND NOT EXISTS (SELECT 1
FROM T2
WHERE T2.PK_COl = T1.PK_Col )
COMMIT TRANSACTION;
将整个upert
操作包装在一个事务中 这些表有主键吗?如果是,那么这应该很容易,除非需要真正的优化。UPDATE语句不应该也有一个WHERE
条件吗?UPDATE语句连接在主键列上,如果没有相应的行,它将更新任何内容,同样,这只是为了演示目的,您可以添加任意数量的条件,这不是一个完整的解决方案,而是一个演示,可以让您找到正确的方向。好吧,我只是有点困惑,因为INSERT
检查了ID列。@SimonCallan哦,不,我已经添加了这个签入插入,因为您的问题中有它,我不知道它为什么在那里:)因为我不知道这里的确切登录名。