Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过插入或更新将数据从一个表复制到另一个表_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 通过插入或更新将数据从一个表复制到另一个表

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 最好的解决方案是什么?如果你想避

我需要将大量数据从一个表复制到另一个表。如果数据已经存在,我需要更新它,否则我需要插入它。要复制的数据正在使用WHERE条件进行选择。数据有一个主键(最多12个字符的字符串)

如果我只是插入数据,我会这样做

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哦,不,我已经添加了这个签入插入,因为您的问题中有它,我不知道它为什么在那里:)因为我不知道这里的确切登录名。