我目前正在从事一个项目,我有2个sql server数据库,需要复制到存档数据库的新记录,并附加更新日期。例子:现有数据库: dbo.A.Category(Id, Name) 将新记录(无副本)复制到:存档数据库: dbo.B.Category(Id, Name, ArchiveDate) 如何仅将已更改的记录从现有数据库复制到存档数据库?这在sql server中。
dbo.A.Category(Id, Name)
dbo.B.Category(Id, Name, ArchiveDate)
uz75evzq1#
对此,可以使用except运算符。例如:
INSERT INTO archiveCategory (id,name,creationdate)SELECT id,name,current_timestampFROM ( SELECT id,name FROM myDB.dbo.category EXCEPT SELECT id,name FROM archiveDB.dbo.category WHERE creationdate = (SELECT max(creationdate) from archiveDB.dbo.category a2 where a.id = a2.id ) ) delta
INSERT INTO archiveCategory (id,name,creationdate)
SELECT id,name,current_timestamp
FROM (
SELECT id,name
FROM myDB.dbo.category
EXCEPT
FROM archiveDB.dbo.category
WHERE creationdate = (SELECT max(creationdate) from archiveDB.dbo.category a2 where a.id = a2.id )
) delta
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 tgtUSING dbo.A.Category AS srcON tgt.[Id] = src.[Id]WHEN MATCHEDAND tgt.[Name] <> src.[Name]THEN UPDATESET [Name] = src.[Name], [ArchiveDate] = SYSDATETIME()WHEN NOT MATCHED BY TARGETTHEN INSERT ( [Id], [Name], [ArchiveDate] )VALUES ( src.[id], src.[name], SYSDATETIME() ) ;GO
MERGE
[Id]
dbo.A.Category
dbo.B.Category
[name]
2条答案
按热度按时间uz75evzq1#
对此,可以使用except运算符。例如:
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