Sql 如何使用MERGE更新源和目标?
我有两个要合并的表。每行包含上次修改的时间。我希望合并这些表,以便将最新的值分配给这两个表 这是我想要使用的代码,被注释掉的是导致我出现问题的原因Sql 如何使用MERGE更新源和目标?,sql,sql-server,insert,merge,Sql,Sql Server,Insert,Merge,我有两个要合并的表。每行包含上次修改的时间。我希望合并这些表,以便将最新的值分配给这两个表 这是我想要使用的代码,被注释掉的是导致我出现问题的原因 -- synchronize databases MERGE [ClientDB].[dbo].[Table] trgt USING [MasterDB].[dbo].[Table] src ON trgt.ID = src.ID WHEN MATCHED THEN -- IF src.LastModified > trgt.Last
-- synchronize databases
MERGE [ClientDB].[dbo].[Table] trgt
USING [MasterDB].[dbo].[Table] src
ON trgt.ID = src.ID
WHEN MATCHED THEN
-- IF src.LastModified > trgt.LastModified -- if the source is newer
UPDATE SET trgt.[Info] = src.[Info] -- update the target
-- ELSE
-- UPDATE SET src.[Info] = trgt.[Info] -- otherwise update the source
WHEN NOT MATCHED BY SOURCE
THEN DELETE
WHEN NOT MATCHED BY TARGET
THEN INSERT ([Info]) VALUES (src.[Info]);
它不起作用有两个原因
1) 它在语法上似乎与嵌套在中的IF
语句不相似,如果匹配,则
2) 它也不希望我更新源代码,这是有问题的,因为我想同步这两种方式。如果我切换trgt
和src
我会得到错误:
无法绑定多部分标识符“src.Description”
我怎样才能做到这一点?我应该放弃合并
,还是它有能力做我想做的事情
我对SQL非常陌生,所以如果它在任何地方出错,请随时纠正我的想法。提前感谢。长话短说,SQL Server只允许您对每条语句修改(插入、更新或删除)一个表。更新两个表需要两条语句。如其他答案和注释中所述,不能在一条语句中执行双向合并,必须使用多条合并语句。事实上,你需要四个
更新ClientDB(包括ON语句中最后修改的比较)
更新MasterDB(包括ON语句中最后修改的比较)
在记录不存在的位置插入ClientDB
在不存在记录的地方插入MasterDB
这会破坏MERGE语句的使用,您可以使用标准的UPDATE&INSERT查询
注意:当源代码不匹配时,您可能也不需要
然后删除
,因为这将无法从另一个数据库获取新记录。我只需要调用merge两次。我决定只有主数据库可以添加或删除整行
这对我很有用:
-- merge databases
-- update the client from the master
MERGE [ClientDB].[dbo].[table] trgt
using [MasterDB].[dbo].[table] src
ON trgt.id = src.id
WHEN matched AND trgt.lastmodified <= src.lastmodified THEN -- if the master has a row newer than the client
UPDATE SET trgt.[info] = src.[info], ... -- update the client
WHEN NOT matched BY source -- delete any rows added by a client
THEN
DELETE
WHEN NOT matched BY target -- insert any rows added by the master
THEN
INSERT ( [info], ... ) VALUES (src.[info], ... );
-- update the master from the client
MERGE [MasterDB].[dbo].[table] trgt
using [ClientDB].[dbo].[table] src
ON trgt.id = src.id
WHEN matched AND trgt.lastmodified < src.lastmodified THEN -- if the client is newer than the master
UPDATE SET trgt.[info] = src.[info], ... -- update the master
——合并数据库
--从主服务器更新客户端
合并[ClientDB].[dbo].[table]trgt
使用[MasterDB].[dbo].[table]src
在trgt.id=src.id上
当匹配并修改trgt.lastmodified时,合并不是这样工作的——它用于在一条语句中对一个表进行更新和插入。这不是同时更新两个表。第二个语句也可能只是一个简单的更新,尽管我可以理解您可能希望使用另一个合并来保持一致性。