插入非重复记录以复制具有更新日期的表

kknvjkwl  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(327)

我目前正在从事一个项目,我有2个sql server数据库,需要复制到存档数据库的新记录,并附加更新日期。例子:
现有数据库: dbo.A.Category(Id, Name) 将新记录(无副本)复制到:
存档数据库: dbo.B.Category(Id, Name, ArchiveDate) 如何仅将已更改的记录从现有数据库复制到存档数据库?这在sql server中。

uz75evzq

uz75evzq1#

对此,可以使用except运算符。例如:

  1. INSERT INTO archiveCategory (id,name,creationdate)
  2. SELECT id,name,current_timestamp
  3. FROM (
  4. SELECT id,name
  5. FROM myDB.dbo.category
  6. EXCEPT
  7. SELECT id,name
  8. FROM archiveDB.dbo.category
  9. WHERE creationdate = (SELECT max(creationdate) from archiveDB.dbo.category a2 where a.id = a2.id )
  10. ) delta
hmmo2u0o

hmmo2u0o2#

你可以通过 MERGE 声明。
我对你想要达到的目标做了以下假设:
这个 [Id] 中的列 dbo.A.Category 包含唯一值
这个 [Id] 中的列 dbo.B.Category 不是标识列,并且值对应于匹配 [Id] 中的值 dbo.B.Category 你只关心更新 [name] 中的值 dbo.A.Category 已更改,而不是使用相同的值更新(例如,如果“bob”更改为“bob”,则不会更改)
不希望从中删除行 dbo.A.Category 同样从 dbo.B.Category ```
MERGE dbo.B.Category AS tgt
USING dbo.A.Category AS src
ON tgt.[Id] = src.[Id]
WHEN MATCHED
AND tgt.[Name] <> src.[Name]
THEN UPDATE
SET [Name] = src.[Name]
, [ArchiveDate] = SYSDATETIME()
WHEN NOT MATCHED BY TARGET
THEN INSERT ( [Id], [Name], [ArchiveDate] )
VALUES ( src.[id], src.[name], SYSDATETIME() ) ;
GO

展开查看全部

相关问题