Sql server 遍历行,检查更新,然后更新行

Sql server 遍历行,检查更新,然后更新行,sql-server,tsql,Sql Server,Tsql,我有一个表(比如说数据库中的表a),它随着时间的推移而更新。我还有另一个表(表B,从外部源创建),它也经过了更新,但来源不同 每个表都有一个ID、名称、RecordDetails、LastUpdateDate 我将如何执行以下操作 遍历表B,并确定表A是否具有相同的ID 如果是,则比较LastUpdateDate字段 如果B有一个最近的LastUpdateDate,则使用B中该记录的所有信息更新该记录 否则,什么也不做 如果表A没有相同的ID,则将B中的记录添加到表A中 停止考虑循环或

我有一个表(比如说数据库中的表a),它随着时间的推移而更新。我还有另一个表(表B,从外部源创建),它也经过了更新,但来源不同

每个表都有一个
ID、名称、RecordDetails、LastUpdateDate

我将如何执行以下操作

  • 遍历表B,并确定表A是否具有相同的ID

    • 如果是,则比较LastUpdateDate字段

      • 如果B有一个最近的LastUpdateDate,则使用B中该记录的所有信息更新该记录

      • 否则,什么也不做

  • 如果表A没有相同的ID,则将B中的记录添加到表A中


停止考虑循环或迭代。SQL Server(以及所有RDBMS)都经过优化,可以在集合上工作。不要考虑你想对每一行做什么;想想你想对一组行做什么

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

UPDATE A
  SET col1 = B.col1,
      col2 = B.col2, 
      etc.
 FROM dbo.TableA AS A
 INNER JOIN dbo.TableB AS B
 ON A.ID = B.ID
 WHERE A.LastUpdatedDate <= B.LastUpdatedDate;

INSERT dbo.TableA(ID, col1, col2, etc.)
 SELECT ID, col1, col2, etc.
  FROM dbo.TableB AS B
  WHERE NOT EXISTS
  (
    SELECT 1 FROM dbo.TableA
      WHERE ID = B.ID
  );

COMMIT TRANSACTION;
将事务隔离级别设置为可序列化;
开始交易;
更新
设置col1=B.col1,
col2=B.col2,
等
从dbo.TableA作为
内部联接dbo.TableB为B
在A.ID=B.ID上
A.LastUpdateDate在哪里